钉钉笔试第三题

import java.util.*;

public class DingDing_3 {
    public static void main(String[] strs) {
        //钉钉3.23第三题
        //一棵n个节点的树,起始所有节点都是B黑色。根节点为1
        //将一些节点染为R红色,要求任意一棵子树中R红色节点的总数不是3的倍数(0也是三的倍数)
        //输入任意一种染色方案


        //想一下怎么做?
        //每个节点都可以选择染为红色还是黑色,那么如果dfs搜索的话,
        //如果一个节点的所有子树都满足,但是到这个节点这里就不满足了,那么只需要将这个节点的颜色翻转。
        //那么从下往上,就这样依次变化呗
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Map<Integer, List<Integer>> mp = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            mp.put(i, new ArrayList<>());
        }
        boolean[] red = new boolean[n + 1];
        for (int i = 1; i <= n - 1; i++) {
            int u = in.nextInt();
            int v = in.nextInt();
            List<Integer> list1 = mp.get(u);
            List<Integer> list2 = mp.get(v);
            list1.add(v);
            list2.add(u);
            mp.put(u, list1);
            mp.put(v, list2);
        }
        help0(1, mp);
        help1(1, mp, red);
        for (int i = 1; i <= n; i++) {
            if (red[i]) {
                System.out.print("R");
            } else {
                System.out.print("W");
            }
        }
    }




    public static void help0(int index, Map<Integer, List<Integer>> mp) { //从根节点向下遍历,去除子节点指向父节点的边
        List<Integer> children = mp.get(index);
        for (Integer child : children) {
            List<Integer> tmp = mp.get(child);
            tmp.remove(Integer.valueOf(index)); //树,单向,去掉子节点指向父节点的边
            help0(child, mp);
        }
    }




    // dfs搜索就行, 起始所有节点为黑色
    // 就是对于某一节点的一棵树,其子树都满足了,获取所有子树的红色节点之和count,如果count % 3 != 0,那么当前节点颜色不用变化
    // 否则就将其染为黑色
    public static int help1(int index, Map<Integer, List<Integer>> mp, boolean[] red) {
        List<Integer> children = mp.get(index);
        int count = 0;
        for (Integer child : children) {
            count += help1(child, mp, red);
        }
        if (count % 3 == 0) {
            red[index] = true; //起始都是黑色,如果不满足的话染成红色
            count += 1;
        }
        return count;


    }


}

全部评论

相关推荐

03-25 19:37
已编辑
蚌埠坦克学院 C++
时隔一年再战字节&nbsp;又是二面挂了😅&nbsp;每次字节都是第一个面的&nbsp;准备的确实也不太好。一面&nbsp;1h左右&nbsp;根据项目问的八股1.&nbsp;介绍项目&nbsp;事务消息在项目中是怎么用的2.&nbsp;除了事务消息还有哪些实现分布式事务的方法&nbsp;优缺点是什么3.&nbsp;2PC&nbsp;3PC的区别4.&nbsp;mysql执行一条插入语句的过程5.&nbsp;mysql中有哪些索引&nbsp;分别用了什么数据结构实现的?&nbsp;比较各种数据结构6.&nbsp;分布式事务和本地事务的区别?7.&nbsp;队列怎么保证消息不丢失&nbsp;不重复消费算法:实现一个类似于MVCC的数据结构&nbsp;按不同时间戳保存数据的多个版本&nbsp;询问时返回数据不超过timestamp的那个版本面试官经典问题:1.&nbsp;为什么要用这个技术实现功能2.&nbsp;这个技术和其他相似技术的区别是什么&nbsp;还知道哪些其他技术3.&nbsp;技术的底层原理感觉面试的核心就是这三个问题二面&nbsp;1h左右1.&nbsp;智能指针介绍一下&nbsp;什么时候用原始指针好?2.&nbsp;深拷贝&nbsp;浅拷贝3.&nbsp;平时怎么用AI辅助编程的&nbsp;有什么经验吗?4.&nbsp;实习过程中做完一个项目有没有总结可复用的内容5.&nbsp;了解大模型评测吗&nbsp;怎么评测的?怎么评估一个测试集的质量?6.&nbsp;有了解AI前沿的技术吗算法题:判断二维平面上3点能否构成三角形&nbsp;主要考虑优化double的精度问题&nbsp;这题我直接用叉积&nbsp;但是面试官说的精度不够&nbsp;我后来又问豆包&nbsp;给的答案和我一样&nbsp;不知道面试官想要什么答案。反问:1.&nbsp;有哪些不足?&nbsp;技术上还行&nbsp;但是对于AI的理解比较欠缺。
查看18道真题和解析
点赞 评论 收藏
分享
评论
4
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务