首页 > 其他分享 >1600. 王位继承顺序

1600. 王位继承顺序

时间:2024-04-07 11:36:07浏览次数:23  
标签:顺序 String iterator 1600 List 王位继承 curOrder kingName children

题面

核心思想

纯模拟!没反应过来是前序遍历~
private Map<String,List<String>> children; 表示一个人的孩子
当调用getInheritanceOrder 时 通过map 搜索答案,由于孩子也有可能有孩子,无限套娃,所以通过递归搜索建立答案。
建立答案的时候也不用考虑是否死亡,我们搜索完成后在去删除死亡的人,不过不能remove这样是o(n)的,通过LinkedList的迭代器实现o(1)的插入与删除

代码



public class ThroneInheritance {

    //王伟继承顺序
    private List<String> curOrder;

    //一个人的所有儿子
    private Map<String,List<String>> children;

    //死亡标记 0表示或者 1表示死亡
    private Map<String,Integer> isDead;

    //国王名字
    private String kingName;
    public ThroneInheritance(String kingName) {
        curOrder = new LinkedList<>();
        children = new HashMap<>();
        isDead = new HashMap<>();
        this.kingName = kingName;
        isDead.put(kingName, 0);
    }

    public void birth(String parentName, String childName) {
        // 出生则添加到mp中 死亡标记置0
        List<String> cd = children.getOrDefault(parentName, new LinkedList<>());
        cd.add(childName);
        children.put(parentName, cd);
        isDead.put(childName, 0);
    }

    public void death(String name) {
        isDead.put(name, 1);
    }

    public List<String> getInheritanceOrder() {
        // 每次查询都清空重新查找
        curOrder.clear();
        // 推入国王
        curOrder.add(kingName);
        // 查找国王的孩子
        if(children.containsKey(kingName)){
            List<String> inheritanceOrderHelper = getInheritanceOrderHelper(children.get(kingName));
            curOrder.addAll(inheritanceOrderHelper);
        }

        Iterator<String> iterator = curOrder.iterator();
        //移出去世的
        while(iterator.hasNext()){
            String key = iterator.next();
            if (isDead.get(key) == 1) {
                iterator.remove();// remove 后会指向前一个元素
            }
        }
        return curOrder;
    }

    private List<String> getInheritanceOrderHelper(List<String> nextTmp) {
        // 这里如果不新建一个List 会影响原Map children中的List 导致数据错误
        List<String> next = new LinkedList<>(nextTmp);
        ListIterator<String> iterator = next.listIterator();
        // 通过迭代器可以实现o(1)的添加操作
        // 如果king 有 alice bob 两个孩子,其中alice 有 sasha 一个孩子
        // 这里就是发现alice有孩子就会把 sasha加入到List中,List变成 alice sasha bob 然后再去找bob的孩子 保证顺序的正确性
        while(iterator.hasNext()){
            String key = iterator.next();

            //找孩子 并把孩子接在后面
            if(children.containsKey(key)){
                List<String> inheritanceOrderHelper = getInheritanceOrderHelper(children.get(key));
                // inheritanceOrderHelper 得到孩子List 按顺序接在父亲后面
                for(String s: inheritanceOrderHelper){
                    iterator.add(s);// iterator  add后会指向新加的元素
                }
            }
        }
        return next;
    }
}

标签:顺序,String,iterator,1600,List,王位继承,curOrder,kingName,children
From: https://www.cnblogs.com/ganyq/p/18118710

相关文章

  • 【C语言】顺序表(原理+实现)
    一.原理1.线性表、顺序表线性表(Linearlist)是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,就如同一条连续的直线,但是在物理结构上不一定是连续的。顺序表(Sequencelist)是线性表的一种,但顺序表不仅在逻辑上是线性的,它在物理上同样是线性的。顺序表的底层......
  • 简单顺序链- - 将第一个链的输出作为第二个链的输入
    fromlangchain.chainsimportLLMChain,SimpleSequentialChain#简单序列链fromlangchain_community.llms.ollamaimportOllamafromlangchain_core.promptsimportPromptTemplatellm=Ollama(model="qwen:7b")template="""您的工作是根据用户建议的区域制......
  • 基于顺序表实现通讯管理系统!(有完整源码!)
    ​​​​​​​                                                                 个人主页:秋风起,再归来~                                   ......
  • 数据结构---顺序表实现
    目录1.顺序表2.动态顺序表的实现(4)顺序表初始化(5)顺序表销毁(6)顺序表的插入a.尾插b.头插(7)顺序表的删除a.尾删b.头删(8)指定位置之前插入(9)指定位置删除(10)顺序表查找数据3.我的心得体会(可跳过)4.顺序表完整代码(1)seqlist.h文件(2)seqlist.c文件(3)test.c文件1.顺序表......
  • 通讯录(顺序表的应用)
    文章目录顺序表思想实现通讯录头文件接口函数主函数顺序表思想实现通讯录实现通讯录前,我们考虑一下,通讯录需要包含什么内容?联系人,联系人需要包含姓名年龄电话性别这3种基本信息。我们知道顺序表实质是个数组,如果我们让数组的每个元素都代表一个联系人,每个联系人又......
  • 两个顺序表的合并问题
    两个顺序表的合并问题#include<stdio.h>#defineMAXSIZE300typedefstruct{ intlength; int*p;}Sqlist;voidSXB(Sqlist&L){ L.length=0; L.p=newint[MAXSIZE];}voidinsert(Sqlist&L,intn){ if(n>MAXSIZE)printf("inputerror!"); in......
  • 数据结构之顺序表的相关知识点及应用
     个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客目录顺序表的概念及结构顺序表的分类顺序表的实现 在顺序表中增加数据 在顺序表中删除数据 在顺序表中查找数据 顺序表源码 顺序表的概念及结构在了解顺序表之前,得先知道......
  • C++数据结构——顺序表
    C++数据结构——顺序表以下代码可以作为一个顺序表的模板,从顺序表的初始化创建到增删改查,都有详细的过程,供学习参考。#include<iostream>#include<stdio.h>usingnamespacestd;#defineelemTypeintstructSequentialList{elemType*elements;intsiz......
  • 顺序表的实现
    在顺序表的实现中我们不会再像之前通讯录一样写菜单来调试了,而是用test函数来直接调用接口调试,因为菜单调试起来过于繁琐,而我们在写数据结构的时候是需要很多次调试函数功能的。所有接口#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>#defineN......
  • 【MySQL系列】--SQL 执行顺序
    不想往后翻直接告诉我结论,好的:)FROM:获取第一张表,称为原表table1,获取第二张表,称为原表table2,将两张表做笛卡尔积,生成第一张中间表Temp1。ON:根据筛选条件,在Temp1上筛选符合条件的记录,生成中间表Temp2。JOIN:根据连接方式的不同,选择是否在Temp2的基础上添加外部行。左外......