004字节面试之延禧攻略

134 阅读2分钟

字节跳动后端面试题之延禧攻略

题目描述:

皇宫之中,乾隆皇帝嫔妃众多,分为多派,经常互相争宠,乾隆皇帝正为此发愁, 他请魏璎珞替他想想办法,希望后宫之中尽可能少的分派。

魏璎珞把后宫中的众多嫔妃叫来,每位嫔妃将自己要好的姐妹名字写在一张字条上。 只要名单中有对方名字,就表示想与对方交好,则分在一派。

例如高贵妃名单中有纯妃,纯妃名单中有富察皇后,则她们三人都会归为一派, 如娴妃名单中没有任何人,其他嫔妃的名单中也没有娴妃,则娴妃自己为一派。

魏璎珞给每位嫔妃编上号,从1开始,共有n位嫔妃,每个人的名单写上想要交好的嫔妃编号,名单后面以0结尾。

互相交好或者间接交好的嫔妃分为一派,最后魏璎珞将分成的派别数上报给皇帝,皇帝十分满意。 皇上询问魏璎珞是如何划分的,魏璎珞将统计的字条给皇上看,字条如下:

10 //有10位嫔妃 0 //1号娴妃不想与任何人交好 5 3 0 //2号则希望能与5号3号姐妹一起 2,5,3 8 4 0 3,8,4 9 0 9 0 3 0 0 //七号不予别人交好,但是别人与他交好也算 7 9 0 0 9 7 0

最后输出派数为 2,除了1号自己为一派,其他人都分为另外一派

思路: 1.创建集合 ;(创建一个集合用于存储,每个嫔妃的交好名单 )(每个嫔妃的交好名单用Set 自动去重)

2.判断两个嫔妃的交好名单是否有交集 ;如果有交集先合并两个交好名单到一个交好名单然后再删除另一个,如无交集 继续向下比较

public class MyWomen {
    public static void main(String[] args) {
        List list = new LinkedList();//存放 每一位嫔妃交好名单的集合
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//嫔妃的数量
        for (int i = 1; i <= n; i++) { //从1号嫔妃开始,把每个人的交好名单存入set ,然后添加进list
            Set set = new HashSet();
            set.add(i);  //注意把自己也要添加进集合
            while (true) {
                int value = sc.nextInt();
                if (value != 0) { //等于0说明结束了(题中已说明)
                    set.add(value);
                } else {
                    break;
                }
            }
            list.add(set);
        }
        //循环结束  list中  {  {一号嫔妃的交好名单},{二号嫔妃的交好名单},.....}
        //接下来就要根据断list中的嫔妃的交好名单,看是否有交集然后进行相应的处理
        for (int i = 0; i < list.size(); i++) { //类似于冒泡排序
            Set set1 = (Set)list.get(i);
            Set resultSet = new HashSet();  //用这个set,来判断set1和set2是否有交集
            for(int j = 0; j < list.size(); j++) {
                Set set2 = (Set)list.get(j);
                resultSet.clear();
                resultSet.addAll(set1);
                resultSet.retainAll(set2);  //resultSet已经等于set1  ,将set1中不包含set2的部分去除,使得resultSet里为set1和set2的交集元素
                if (set1 != set2 && resultSet.size() >= 0) {//resultSet.size() >= 0说明set1与set2不为空
                    set1.addAll(set2); //将set2融进set1中(HashSet自动去重)
                    list.remove(j);    //set2已经与set1融合,删除set2
                } else {
                    j++;
                }
            }  //list中的size即是分组的个数
        }
        System.out.println(list);
    }
}