4月9日-云智-后台开发-26暑期实习笔试
📍笔试公司
云智研发公司
👜笔试岗位
后台开发-2026届暑期实习生
📖笔试问题
题型及要求
20个单项选择题,一个两分,40分;3道算法题,是ACM模式,60分,提示说可以在本地IDE上写代码,之后再粘贴到答题框。用的是牛客网的系统,双机位,手机需要用微信扫码后保持在那个界面(不过手机没要求开启摄像头),建议考前充满电或考试时插上充电器。
具体内容
一、选择题
具体内容记不太清了,大概有MySQL、Redis、计算机网络、Java基础等,个人感觉难度适中。
二、编程题
1.阶乘中0的个数
输入一个整数 n,计算 n! 中含有多少个 0。
例如,
输入:
12
输出:
4
解释:12! = 479001600,有4 个 0 ,则输出 4。
个人解法:暴力求解,先求 n!,再 %10、/10 求结果中 0 的个数。(注意题目中 n 的范围,用 int 接收 n! 会有溢出,需要使用 long)
2.数组涂红
输入一个整数数组,小红每次涂红其中的几个数,求未涂红的数的和。
第一行的两个数 n,k 分别表示数组长度和涂红的个数,第二行为整数数组,第三行为涂红的序号(从 1 开始)。
例如,
输入:
5 2
2 5 1 8 4
1 3
输出:
17
解释:第 1 个和第 3 个数涂红,则不涂红的数的和为 5 + 8 + 4 = 17。
个人解法:暴力求解,先求整个数组的元素和,再减去涂红数字的和。(注意题目中数组元素的范围,用 int 接收元素和会有溢出,需要使用 long)
3.合法计算式
输入一个只含有 '+'、'-' 和数字的字符串, 求从第 1 个字符开始组成的最大合法计算式的长度。
例如,
输入:
+348-234
输出:
0
解释:从首个字符开始无合法计算式。
输入:
2+072
输出:
1
解释:合法计算式为 2( 072 不合法)。
输入:
234-+21
输出:
3
解释:合法计算式为 234。
个人解法:暴力求解,列举不合法的情况后排除,不过应该是没列举全,只过了 30% 测试用例。
今天让 DeepSeek R1 试了一下,看起来应该是正确的,不过没处理输入输出,回答如下:
“为了解决这个问题,我们需要找到从字符串的第一个字符开始的最长合法计算式的长度。合法计算式的定义是:由数字和运算符交替组成,并且每个数字必须是合法的(即不以零开头,除非该数字本身就是零)。
方法思路
(1)初始检查:首先检查字符串是否以数字开头,如果不是,直接返回0。
(2)处理第一个数字:找到第一个数字的结束位置,并检查该数字是否合法。如果该数字以零开头且长度大于1,则视为非法,此时最长合法长度为1。
(3)处理后续运算符和数字:在第一个数字合法的情况下,继续处理后续的运算符和数字。每次遇到运算符后,检查后面是否有合法数字,直到无法继续为止。
解决代码
public class Solution { public int longestValidExpression(String s) { if (s == null || s.length() == 0) { return 0; } // 检查第一个字符是否是数字 if (!Character.isDigit(s.charAt(0))) { return 0; } int maxLen = 0; int n = s.length(); // 处理第一个数字 int i = 0; while (i < n && Character.isDigit(s.charAt(i))) { i++; } int firstNumberLength = i; boolean firstNumberValid = true; if (firstNumberLength > 1 && s.charAt(0) == '0') { firstNumberValid = false; } if (firstNumberValid) { maxLen = firstNumberLength; // 处理后续的运算符和数字 int pos = firstNumberLength; while (pos < n) { // 检查当前字符是否是运算符 if (s.charAt(pos) != '+' && s.charAt(pos) != '-') { break; } // 运算符后面必须有数字 int numStart = pos + 1; if (numStart >= n) { break; } int j = numStart; while (j < n && Character.isDigit(s.charAt(j))) { j++; } int numLength = j - numStart; if (numLength == 0) { break; } // 检查数字是否合法 boolean numValid = true; if (numLength > 1 && s.charAt(numStart) == '0') { numValid = false; } if (numValid) { maxLen = j; // 当前总长度为j的位置(0到j-1) pos = j; } else { break; } } } else { // 第一个数字以0开头且长度>1,合法部分只能是0 maxLen = 1; } return maxLen; } }
代码解释
(1)初始检查:首先检查输入字符串是否为空或第一个字符是否为非数字,若是则返回0。
(2)处理第一个数字:通过循环找到第一个数字的结束位置,并检查其合法性。如果该数字以零开头且长度大于1,则视为非法,最长合法长度设为1。
(3)处理后续运算符和数字:在第一个数字合法的情况下,依次处理每个运算符及其后面的数字。每次遇到运算符后,检查后续数字的合法性,合法则更新最长长度,非法则终止循环。”
以上题目内容全凭记忆,如果有错误,欢迎指出!或者算法题有更优的解法也可提出!祝大家一切顺利!
#软件开发笔面经##笔试#