首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客772183349号
吉林大学 算法工程师
关注
已关注
取消关注
@愉快的可乐希望被捞:
携程4.16笔试
第二道:三个数组abc,游游打算重排c数组,使得尽可能多的下标i满足ai+bi=ci。思路:ai+bi的值是固定的 先用一个for循环算一遍 放到map里 ,key是值,value是个数,然后再用一个for循环 看看数组c里的值有没有在map里出现,有的话 计数+1,并且让map里相应的key 值-1 然后就好了。第三题:给一个数组,每次操作可以把相邻的两个素数元素进行合并,合并后的新数为原来的两个数之和,并删除原来两个数。现在希望最终数组的元素数量尽可能少。第一行输入n表示数组大小,第二行输入n个正整数,表示数组元素。思路:1.写一个检查是否是素数的函数2.写一个合并函数:2.1先判断2 这个特殊情况 因为素数2和相邻的素数合并 结果可能是素数也可能是非素数 别的素数合并都是非素数。所以要先判断存不存在2和相邻的一边的素数合并是素数 另一边合并不是素数的情况 比如数组7 2 3 后两个先合并和前两个先合并就不一样。2.2再把其余素数合并代码:import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class PrimeMerge { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); List<Integer> numbers = new ArrayList<>(); // 读取数组元素 for (int i = 0; i < n; i++) { numbers.add(scanner.nextInt()); } // 关闭Scanner scanner.close(); // 合并素数,优先处理2 mergePrimesWithPriorityToTwo(numbers); // 输出最终数组 for (int num : numbers) { System.out.print(num + " "); } } private static void mergePrimesWithPriorityToTwo(List<Integer> numbers) { // 检查一个数是否是素数的辅助函数 boolean isPrime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return false; } } return true; } // 合并2与其相邻的素数 for (int i = 0; i < numbers.size(); ) { if (numbers.get(i) == 2) { // 检查左边是否有素数可以合并 if (i > 0 && isPrime(numbers.get(i - 1)) && isPrime(numbers.get(i - 1) + 2)) { numbers.set(i - 1, numbers.get(i - 1) + 2); numbers.remove(i); } else if (i < numbers.size() - 1 && isPrime(numbers.get(i + 1)) && isPrime(numbers.get(i + 1) + 2)) { // 检查右边是否有素数可以合并 numbers.set(i, numbers.get(i) + numbers.get(i + 1)); numbers.remove(i + 1); } else { // 没有可以合并的素数,继续下一个数 i++; } } else { i++; } } // 合并剩余的素数对 for (int i = 0; i < numbers.size() - 1; ) { if (isPrime(numbers.get(i)) && isPrime(numbers.get(i + 1)))) { numbers.set(i, numbers.get(i) + numbers.get(i + 1)); numbers.remove(i + 1); } else { i++; } } } }第四题:定义一棵树的直径为:任意两个节点的距离的最大值。现在定义f(i):对i号节点上再连接一个新的子叶节点后,树的直径长度。现在要求f(1)到f(n)的值。输入描述:第一行输入一个正整数n,代表树的节点数量。接下来的n-1行,每行输入两个正整数u和v,代表u号节点和v号节点之间有一条长度为1的边连接。变量的范围:1≤n≤10的五次方,1≤u,v≤n。思路:第四题说是树的直径,但其实就是图,但是可以用二叉树类比着来做。1.写一个树类,val表示节点编号,children表示孩子链表。把每个节点创建处理并保存,把每个节点的孩子节点添加一下。2.写一个for循环,针对每个f(i),把新的子叶节点添加一下,然后调用dfs处理得到f(i)值。3.dfs:二叉树求直径实际上是求子树的深度,然后左右子树深度相加就是直径,返回结果是左右子树深度的最大值+1。同样的道理,这里也是求所有子树的深度,记录最大深度和第二大深度,然后f(i)就是最大深度和第二大深度之和,返回结果就是最大深度+1。代码:import java.util.*;class TreeNode { int val; List<TreeNode> children; public TreeNode(int val) { this.val = val; children = new ArrayList<>(); }}public class TreeDiameter { public static int[] f; // 存储每个节点的f(i)值 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 树的节点数量 f = new int[n + 1]; // 初始化f数组 // 构建树的数据结构 TreeNode[] nodes = new TreeNode[n + 1]; for (int i = 1; i <= n; i++) { nodes[i] = new TreeNode(i); } // 连接节点之间的关系 for (int i = 0; i < n - 1; i++) { int u = scanner.nextInt(); int v = scanner.nextInt(); nodes[u].children.add(nodes[v]); nodes[v].children.add(nodes[u]); } // 遍历每个节点,添加一个新的子叶节点,计算f(i) for (int i = 1; i <= n; i++) { // 添加新的子叶节点 addLeafAndDFS(nodes[i], n + i); // 计算f(i) dfs(nodes[i], null, i); } // 输出结果 for (int i = 1; i <= n; i++) { System.out.print(f[i] + " "); } } // 添加新的子叶节点,并调用dfs计算f(i) public static void addLeafAndDFS(TreeNode node, int newLeafValue) { TreeNode newLeaf = new TreeNode(newLeafValue); // 创建新的子叶节点 node.children.add(newLeaf); // 添加到当前节点的子节点中 newLeaf.children.add(node); // 添加当前节点作为新的子叶节点的父节点 } // 递归计算以当前节点为根的子树的直径 public static void dfs(TreeNode node, TreeNode parent, int i) { int maxDepth1 = 0; // 最大深度 int maxDepth2 = 0; // 次大深度 // 遍历当前节点的子节点 for (TreeNode child : node.children) { if (child == parent) continue; // 避免回溯 int childDepth = dfs(child, node, i); // 递归计算子节点的深度 if (childDepth > maxDepth1) { maxDepth2 = maxDepth1; maxDepth1 = childDepth; } else if (childDepth > maxDepth2) { maxDepth2 = childDepth; } } // 更新f(i) f[i] = Math.max(f[i], maxDepth1 + maxDepth2); }}
点赞 7
评论 7
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-28 09:23
杭州电子科技大学 大数据开发工程师
关于实习,我悟了
1、最重要的第一步,做好手里的活儿一个审计事务所的老师说,他曾经带过一个实习生,学校背景不错,能力也不错,但是不屑于做实习工作中那些简单的活儿。给他一个简单的统计任务,他很快做好了,拿着数据过来,然后说,我整理好了,最后你把这个和这个再加起来就行。老师简直哭笑不得,我是让你来帮我工作的,不是让你来教我怎么去计算的。给你一个基础性的工作,你知不知道为什么要做?这个要给谁看?怎么能让别人看的更清楚、更直观?重复性的工作如何找到一个好的工作方法提高效率?多项工作的时候如何判断优先级?你对这个工作的理解,决定了你交付的出来的成果,只有从完成好基础性工作这一步建立了信任感,别人才会把更多的工作内容交给你...
实习打杂,要跑路吗
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
07-31 17:23
美团
在职实习能投秋招吗?会不会被发现
点赞
评论
收藏
分享
06-22 21:02
广东药科大学 Java
请问这是在招奴隶吗
这种公司就赶紧避雷吧,有bug半夜也要起来?还学习腾讯,自己几斤几两不清楚吗
Java大菜狗:
纯纯招黑奴,一天还不到两百那么多要求,还不迟到早退,以为啥啊,给一点工资做一堆活,还以不拖欠员工工资为荣,这是什么值得骄傲的事情吗,纯纯***公司
点赞
评论
收藏
分享
07-04 15:54
广东白云学院 Java
大二暑期找不到实习啊!
大二期末周才想起来要去找一份实习,可惜太晚了,实习岗位都被抢完了,boss投了一个多星期,基本上都是已读不回,更有一些简历都没发就说不合适。第一次感受到java竞争的强度,想要找一份实习,不然怕没实习经验大四毕业都找不到工作,各位大佬看看简历还有什么地方需要修改。
程序员小白条:
主要太晚投了,然后是学历层次,很多已读不回也正常,多持续一段时间吧, 算法多刷刷先,说不定有用
点赞
评论
收藏
分享
08-01 12:27
北京理工大学 数据分析师
虾皮数分
到底是什么bg才能进呀7.30投递8.1拒信能不能让我开开眼
投递虾皮信息等公司10个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
百度提前批,三面被推迟一周,喜提秋招第一凉
7605
2
...
虾皮秋招一面
3359
3
...
他拿大厂SSP Offer打牌是什么概念啊?25届双非之光
3237
4
...
百度提前批 三面
2902
5
...
小鹏offer
1668
6
...
虾皮一面凉经
1500
7
...
被猿辅导挂了简历,但我想说...
1486
8
...
上班一周,工资还没拿,先欠公司两千
1389
9
...
最强本科✌
1374
10
...
大学四年,我感觉我像个“孤勇者”
1300
创作者周榜
更多
正在热议
更多
#
简历上的经历如何包装
#
29959次浏览
824人参与
#
秋招被确诊为……
#
164385次浏览
757人参与
#
中兴秋招
#
205991次浏览
2299人参与
#
工作中哪个瞬间让你想离职
#
63876次浏览
569人参与
#
你最希望上岸的公司是?
#
135333次浏览
706人参与
#
和同事相处最忌讳的是__
#
24616次浏览
244人参与
#
25届网易互娱暑实进度
#
78452次浏览
702人参与
#
虾皮求职进展汇总
#
249668次浏览
1863人参与
#
投格力的你,拿到offer了吗?
#
86899次浏览
584人参与
#
2022毕业即失业取暖地
#
102746次浏览
662人参与
#
2022毕业生求职现身说法
#
89325次浏览
700人参与
#
秋招OC许愿
#
327854次浏览
2450人参与
#
你最近一次加班是什么时候?
#
71032次浏览
350人参与
#
26届的你,投了哪些公司?
#
45999次浏览
500人参与
#
你的秋招第一面感觉怎么样
#
77003次浏览
592人参与
#
柠檬微趣工作体验
#
6775次浏览
40人参与
#
你遇到最难的面试题目是_
#
16807次浏览
201人参与
#
我对___祛魅了
#
49033次浏览
442人参与
#
地平线求职进展汇总
#
52683次浏览
370人参与
#
研究所VS国企,该如何选
#
194883次浏览
1819人参与
#
如果校招重来我最想改变的是
#
272005次浏览
2853人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务