4-9 笔试邀请 腾讯云智后台开发
深夜的办公室里,最后一行代码刚刚提交,我揉了揉酸涩的双眼,瞥见手机屏幕上弹出新的笔试邀请——这已是本周第三场。合上电脑,地铁的末班车早已驶离,我裹紧外套走进寒风里,耳机循环播放着“八股文”音频,脑中却盘算着明天的实习任务和未完成的LeetCode周赛。这大概是我过去 1 个月的常态:白天在实习中争分夺秒地吸收工程经验,夜晚在牛客网上与算法题鏖战,周末则化身“时间管理大师”,辗转于各大笔试平台的双机位镜头前。
焦虑吗?当然。每当看到同龄人晒出offer时,指尖总会不自觉地刷新邮箱;在实习通勤的地铁上刷面经,却因错过站台而狼狈狂奔;甚至梦见IDE报错提示化作巨浪将自己吞没……但更深处的,是一种近乎执拗的渴望——渴望在每一次系统设计的讨论中捕捉灵光,渴望在每一场技术面试的博弈中突破认知边界,更渴望证明,那些在时间夹缝中挤出的努力,终会沉淀为成长的年轮。
选择记录这些笔试题解,不仅是为这段“双线作战”的日子留下注脚,更是想告诉所有在求职路上踽踽独行的伙伴:那些在黑暗中辗转反侧的时刻、在失败后咬牙重启的瞬间,从不是无意义的消耗。当我们把每道错题刻进记忆,将每次模拟面试视作实战,焦虑便悄然化作燃料。愿这些带着体温的解题思路,能为你照亮一寸前路,也愿我们终能在这场漫长的跋涉中,与更好的自己相遇。
4.5 官网投递~4.9 牛客初筛后台 测试均通过 ~4.11 笔试邀约(3 个工作日内完成)
希望还有下面面试的机会吧 第一个正式的暑假实习笔试💪
手机小程序必须保持 然后屏幕共享摄像头开启
题型回忆版
基础选择题
数据库锁 计组芯片组合成指定 操作系统 计算机网络等基础题型
给出一段程序看时间复杂度 看程序输出是否有问题 能否正常编译运行
消息队列 考场景
java 选择题
看程序输出是否有问题 能否正常编译运行
算法题 ac 代码
1.阶乘中0的个数
输要计算给定正整数 n的阶乘的十进制表示中包含的数字0的数量。这里的数字0包括所有位置上的0
import java.util.Scanner; // 导入Scanner类,用于读取用户输入 public class test01 { public static void main(String[] args) { // 创建Scanner对象读取输入 Scanner scanner = new Scanner(System.in); // 读取用户输入的正整数n int n = scanner.nextInt(); // 初始化阶乘结果为1(0!和1!均为1) long factorial = 1; // 从2开始循环计算n的阶乘 for (int i = 2; i <= n; i++) { factorial *= i; // 累乘计算阶乘 } // 将阶乘结果转换为字符串,以便逐字符检查 String s = Long.toString(factorial); // 初始化计数器,统计0的个数 int count = 0; // 遍历字符串中的每个字符 for (char c : s.toCharArray()) { if (c == '0') { // 如果当前字符是'0' count++; // 计数器加1 } } // 输出最终结果 System.out.println(count); } }
计算给定01字符串中每个字符前面与其不同字符的数量
import java.util.Scanner; public class test02 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int T = scanner.nextInt(); for (int t = 0; t < T; t++) { int n = scanner.nextInt(); scanner.nextLine(); String s = scanner.nextLine(); int[] result = new int[n]; int a = 0, b = 0; for (int i = 0; i < n; i++) { char c = s.charAt(i); if (c == '0') { result[i] = b; a++; } else { result[i] = a; b++; } } StringBuilder c = new StringBuilder(); for (int num : result) { c.append(num).append(" "); } if (c.length() > 0) { c.setLength(c.length() - 1); } System.out.println(c); } } }
这段代码用于解决如下问题:对于给定多个01字符串,计算每个字符前与其不同字符的数量。例如,字符是'0'时统计前面有多少个'1',反之亦然。
思路详解
- 输入处理:
- 初始化计数器:
- 遍历字符串:
- 输出结果:
关键点
- 计数器更新逻辑:根据当前字符类型选择对应的计数器,并更新另一个计数器。
- 时间复杂度:每组数据时间复杂度为
O(n)
,总复杂度为O(T*n)
,适用于题目给定的数据范围(n ≤ 1000
,T ≤ 100
)。 - 输入处理细节:使用
scanner.nextLine()
跳过换行符,确保正确读取后续输入。
示例验证
以输入"0101"
为例:
- 索引0(字符
0
):前面无字符,b=0
→result[0]=0
,a=1
。 - 索引1(字符
1
):前面0
的数量a=1
→result[1]=1
,b=1
。 - 索引2(字符
0
):前面1
的数量b=1
→result[2]=1
,a=2
。 - 索引3(字符
1
):前面0
的数量a=2
→result[3]=2
,b=2
。输出结果为0 1 1 2
,符合预期。
该代码通过动态维护两个计数器,高效地解决了问题,逻辑清晰且效率较高。
3 01背包/贪心 在给定的预算范围内选择菜品,使得牛牛的总收益最大化
dp 思路代码
01 背包问题
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int budget = scanner.nextInt(); scanner.nextLine(); // 清除缓冲区 int[] salePrices = new int[n]; int[] profits = new int[n]; for (int i = 0; i < n; i++) { int cost = scanner.nextInt(); int price = scanner.nextInt(); salePrices[i] = price; profits[i] = price - cost; scanner.nextLine(); // 确保每行输入处理完整 } int[] dp = new int[budget + 1]; for (int i = 0; i < n; i++) { int price = salePrices[i]; int profit = profits[i]; for (int j = budget; j >= price; j--) { dp[j] = Math.max(dp[j], dp[j - price] + profit); } } int maxProfit = 0; for (int j = 0; j <= budget; j++) { maxProfit = Math.max(maxProfit, dp[j]); } System.out.println(maxProfit); } }
贪心 50%通过
import java.util.Scanner; import java.util.Arrays; import java.util.Comparator; public class test031 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int[][] h = new int[n][3]; for (int i = 0; i < n; i++) { int a = scanner.nextInt(); int b = scanner.nextInt(); h[i][0] = a; h[i][1] = b; h[i][2] = b - a; } // 按单位利润从高到低排序 Arrays.sort(h, new Comparator<int[]>() { public int compare(int[] dish1, int[] dish2) { double s = (double) dish1[2] / dish1[1]; double z = (double) dish2[2] / dish2[1]; if (s > z) {//比较单位利润大小 return -1; } else if (s < z) { return 1; } else { return 0; } } }); int totalProfit = 0; int shengyu = m;//剩余预算 for (int i = 0; i < n && shengyu > 0; i++) { if (h[i][1] <= shengyu) { totalProfit += h[i][2]; shengyu -= h[i][1]; } } System.out.println(totalProfit); } }
deepseek 回答、
以下是对这段使用贪心算法的代码只能通过 50% 测试用例的原因分析:
问题背景推测
从代码来看,这是一个资源分配的问题,可能是在预算 m
的限制下,从 n
个菜品中选择菜品以获取最大利润。每个菜品有成本 a
和售价 b
,利润为 b - a
,代码尝试按单位利润(利润 / 售价)从高到低排序,然后依次选择菜品,直到预算用完。
贪心算法局限性导致的问题
- 贪心选择性质不满足贪心算法的核心是每一步都做出当前看起来最优的选择,期望最终得到全局最优解。但在这个问题中,按单位利润排序并依次选择菜品并不一定能保证得到全局最优解。例如,假设有三个菜品:
- 菜品 1:成本
a1 = 10
,售价b1 = 20
,利润b1 - a1 = 10
,单位利润为10 / 20 = 0.5
。 - 菜品 2:成本
a2 = 50
,售价b2 = 100
,利润b2 - a2 = 50
,单位利润为50 / 100 = 0.5
。 - 菜品 3:成本
a3 = 30
,售价b3 = 40
,利润b3 - a3 = 10
,单位利润为10 / 40 = 0.25
。如果预算m = 60
,按照贪心算法,可能会先选择菜品 1,再选择菜品 3,总利润为10 + 10 = 20
。但实际上选择菜品 2 可以获得利润50
,这说明贪心算法做出的局部最优选择不一定能得到全局最优解。
- 未考虑物品的组合情况贪心算法是一种短视的算法,它只关注当前步骤的最优选择,而不考虑后续步骤以及物品之间的组合情况。在这个问题中,可能存在一些组合方式,虽然单个物品的单位利润不是最高,但组合起来能获得更高的总利润。
边界情况和特殊情况处理不足
- 预算分配不完全代码中在选择菜品时,只有当菜品的售价小于等于剩余预算时才会选择该菜品,没有考虑部分选择的情况。例如,如果一个菜品售价为 20,而剩余预算为 15,贪心算法会直接跳过这个菜品,而没有考虑是否可以部分购买该菜品以获得部分利润。
- 数据类型和精度问题虽然代码中使用了
double
类型来计算单位利润,但在比较单位利润时,使用了简单的>
和<
比较,可能会存在精度问题。在某些特殊情况下,由于浮点数的精度问题,可能会导致排序结果不准确,从而影响最终的利润计算。
改进建议
可以考虑使用动态规划算法来解决这个问题,动态规划通过枚举所有可能的状态和选择,能够保证得到全局最优解。具体实现时,可以定义一个二维数组来记录不同预算下选择不同菜品组合的最大利润,然后通过状态转移方程进行递推计算。
#你的实习什么时候入职##牛客创作赏金赛##腾讯云智研发2025实习生招聘#