小红书4.9笔试

1题选手,太菜了受不了了

1.平衡,给出一个树,删除任意一条边,求删除后两个树的节点之差的绝对值最小值,并且求方案数目

输入:

第一行 节点数目n

第二行连续n-1行,输入两个数,表示两个节点有1条边

输出

最小值 空格 方案数

思路:

一次遍历记录子树节点数目在subtrees。

一次遍历在遍历子节点的时候 算出删除父子节点边后的 两个树的节点数目之差,借助subtrees,同时得到最小值。

一次遍历 同上次遍历,但是是判断节点数目之差等于最小值的情况数目。

import java.util.*;

public class Main {
    static int n;
    static int mins=Integer.MAX_VALUE;
    static int[] subtrees;
    static boolean[] visit;
    static boolean[] visit2;
    static boolean[] visit3;
    static ArrayList<Integer>[] res;
    static  int result=0;

    public static int dfs1(int i){
        visit[i] = true;
        int subcount=1;
        for(int j=0;j<res[i].size();j++){
            int next = res[i].get(j);
            if(!visit[next]){
                subcount += dfs1(next);
            }
        }
        subtrees[i]=subcount;
        return subcount;
    }

    public static void dfs2(int i){
        visit2[i]=true;
        for(int j=0;j<res[i].size();j++){
            int next = res[i].get(j);
            int ret = subtrees[next];
            int ret2 = n-ret;
            int chec = Math.abs(ret2-ret);
            if(mins>chec)mins=chec;
            if(!visit2[next]){
                dfs2(next);
            }
        }
    }

    public static void dfs3(int i){
        visit3[i] = true;
        for(int j=0;j<res[i].size();j++){
            int next = res[i].get(j);
            if(!visit3[next]){
                int ret = subtrees[next];
                int ret2 = n-ret;
                int chec = Math.abs(ret2-ret);
                if(mins==chec)result++;
                dfs3(next);
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        res = new ArrayList[n+5];
        visit = new boolean[n+5];
        visit2 = new boolean[n+5];
        visit3 = new boolean[n+5];
        subtrees = new int[n+5];
        for(int i=0;i<n+5;i++){
            res[i] = new ArrayList<Integer>();
        }
        for(int i=0;i<n-1;i++){
            int v = sc.nextInt();
            int u = sc.nextInt();
            res[v].add(u);
            res[u].add(v);
        }
        dfs1(1);
        dfs2(1);
        dfs3(1);
        System.out.print(mins);
        System.out.print(" ");
        System.out.println(result);
    }
}

#我的实习求职记录##小红书信息集散地##小红书24届实习招聘#
全部评论
同一题选手
2 回复 分享
发布于 2023-04-09 18:15 湖北
请问一下,在saima这种平台,如何写输入输出参数呀?
1 回复 分享
发布于 2023-04-09 18:28 山东
蟹蟹朋友的分享!我想问一下分享这种笔试题目会不会违反什么保密的条例啊?
点赞 回复 分享
发布于 2023-04-09 22:00 广东
小红书面试贼简单,连自我介绍12分钟夸张
点赞 回复 分享
发布于 2023-04-09 19:20 四川
请问最后一道题只输出测试样例这种还能给分吗,根本没时间做
点赞 回复 分享
发布于 2023-04-09 18:37 天津

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
01-19 12:48
门头沟学院 C++
只想搞钱的鸽子很喜欢...:混账是很多的,还有那些在自己风华正茂的年纪说风凉话讥讽那些下岗前员工的。这些人都是现在职场环境这么烂的帮凶
点赞 评论 收藏
分享
评论
1
12
分享

创作者周榜

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