小红书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 18:37 天津
小红书面试贼简单,连自我介绍12分钟夸张
点赞
送花
回复
分享
发布于 2023-04-09 19:20 四川
蟹蟹朋友的分享!我想问一下分享这种笔试题目会不会违反什么保密的条例啊?
点赞
送花
回复
分享
发布于 2023-04-09 22:00 广东

相关推荐

#美团二面##平台技术部##实习##美团##美团OC##美团一面##你收到了团子的OC了吗##美团到店#年前在投递日常,发现没有反馈,年后回来等到暑期又继续投了----时间线0312&nbsp;投递0323&nbsp;笔试(3/5)0329&nbsp;一面0401&nbsp;二面0407&nbsp;HR电话,OC----面经一面:MQ的使用场景?为什么redis的list做消息队列不可靠?出现消息丢失?MQ如何能够保证消息传输可靠?MQ消息处理失败异常了,怎么处理?MQ死信队列使用场景?如果消息处理很久没有反应,MQ会超时么?SpringBoot&nbsp;AOP&nbsp;IOC?AOP只能在SpringBoot里实现么?Mysql&nbsp;事务隔离级别?可重复读和读已提交的区别?什么时候会产生不可重复读的现象Mysql数据库中的乐观锁和悲观锁概念?Java的乐观锁和悲观锁?CAS?项目中有涉及用到乐观锁或悲观锁么?场景题:扫码实现登录的过程二面:ReentryLock和sychronized关键字,功能区别?API层面说说?ReentryLock是基于什么来实现的?说说原理?非公平和公平锁区别?在ReentryLock中的具体实现?CLH队列的底层数据结构?CLH队列怎么保证线程安全的?具体实现?AQS怎么实现线程的阻塞与唤醒?具体说API、过程?AQS的设计模式?(模板方法)Spring源码或本身内部的功能,哪些基于AOP实现的自己开发哪些用到AOP?AOP的切面什么时候会失效?LC算法题:链表去重复目前比较关注哪些技术的领域?在过往的一些项目经历上,有哪些能力是需要显著提升的?或者遇到的难点,怎么去做的?遇到的难点,怎么找到解法方案的?如何评判?有没有一些事情,其他人做的比较好了,但是你看到了可以改进的点,然后付出行动做出了一些实质变化?项目怎么保证质量的?项目按时交付?职业规划?
点赞 评论 收藏
转发
1 12 评论
分享
牛客网
牛客企业服务