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)处理后续运算符和数字:在第一个数字合法的情况下,依次处理每个运算符及其后面的数字。每次遇到运算符后,检查后续数字的合法性,合法则更新最长长度,非法则终止循环。”

以上题目内容全凭记忆,如果有错误,欢迎指出!或者算法题有更优的解法也可提出!祝大家一切顺利!

#软件开发笔面经##笔试#
全部评论
接好运
1 回复 分享
发布于 04-11 18:28 陕西省

相关推荐

点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务