字节跳动算法工程师笔试(2019.8.11)

四道题,跟想象中难度差不多,但是没想到因为卡了一下时间有点紧没搞出最后一题🤣有点难顶。
第一题,感觉是时间化成分钟,然后排序找一下最大的符合条件的时间,不知道为什么只有80;
第二题,手玩一下可以发现其实可以一个个推出来的,一开始头脑有点蒙交了个O(n*k)的东西上去,只有83.33。。。其实推的时候可以处理一下答案的前缀异或和,复杂度可以降到O(n),这题100;
第三题,一开始想dfs+记忆化,如果遇到左右有工龄小的再递归搜下去(印象中去年CCPC桂林有一道类似的题,当时现场AC了)。然后发现n只有1000,所以想了个简单点的,首先将工龄离散化到[0, 1000]以内,然后对于每一个离散化后的工龄,找属于这个工龄的人,然后给他符合题目的奖金,注意边角特殊判断,这样就可以有序的逐步得到奖金了,复杂度是O(n^2),得分100;
第四题,这题没写完,讲一下我的理解。其实转化一下题意就是求树上%3=0, 1, 2的路径数量是多少,最终答案分别*3, *2, *1就可以了。然后就感觉是做两次树DP,第一次树DP求出以当前节点为端点,长度分别为%3=0, 1, 2的路径的数量。第二次树DP,求以当前节点为根的树中,树上%3=0, 1, 2的路径数量。假设我们选0为根节点,那么我们最终的答案就是dp[0][0],dp[0][1],dp[0][2], 父亲和单个子节点之间的转移非常明显,就是增加了父亲到孩子的这一条边,转移过来就是0->1,1->2,2->0,然后多的这一条边记得加上去;然后两个子节点之间也是可以通过父亲进行连接的,然后就懵了。。如果给颗菊花树出来,妥妥的TLE。。。纠结了很久没,打算写一发试试然后发现没时间了。。;
以上是大概的想法,写的比较乱,抛砖引玉,欢迎各位大佬来交流🤣🤣🤣

#字节跳动##算法工程师##笔经##校招#
全部评论
第一题是有问题的。有一个测试用例,所有的闹钟响都会导致迟到,所以直接输出最早的那个闹钟的时间就通过了。
点赞 回复 分享
发布于 2019-08-11 22:36
分享一下我的1-3题O(n)思路:https://www.nowcoder.com/discuss/221175
点赞 回复 分享
发布于 2019-08-11 22:34
我的思路也是类似,不过第3题我用的是bfs
点赞 回复 分享
发布于 2019-08-11 22:29
我没sort,竟然过了80.。。有人把这个题得牛客网连接找出来了,我测了一下,sort以后就过了 import java.util.Arrays; import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         while ( sc.hasNextLong() ) {             int n = sc.nextInt();             int[] times = new int[n];             for (int i = 0; i < n; i++) {                 int h = sc.nextInt() * 60;                 int m = sc.nextInt();                 times[i] = h + m;             }             Arrays.sort(times);             int cost = sc.nextInt();             int sh = sc.nextInt() * 60;             int sm = sc.nextInt();             int target = sh + sm;             int left = target - cost;             int res = -1;             for (int i = 0; i < n; i++) {                 if (left == times[i]) {                     res = left;                     break;                 }             }             for (int i = 1; i < n; i++) {                 if (left > times[i - 1] && left < times[i]) {                     res = times[i - 1];                     break;                 }             }             int hour = res / 60;             int min = res % 60;             System.out.println(hour + " " + min);         }     } }
点赞 回复 分享
发布于 2019-08-11 21:36
你是什么方向的
点赞 回复 分享
发布于 2019-08-11 21:34

相关推荐

2025-12-26 10:52
河北传媒学院 Java
点赞 评论 收藏
分享
评论
点赞
18
分享

创作者周榜

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