网易笔试 网易秋招 网易笔试题 0921

笔试时间:2025年9月21日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

给定一个字符串 s,包含以下字符:(, ), <, > 和 *。其中字符 * 可以变换成 ), > 中的任意一个右括号。判断字符串是否有效,有效字符串需要满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
  4. 字符 * 只能作为右括号使用,通过变换成合适的类型来匹配左括号。

输入描述

1≤s.length≤10^4 s 仅由括号 '()<>' 和 '*' 组成

输出描述

字符串 s 是有效字符串输出 true,否则输出 false。

样例输入

()

样例输出

true

参考题解

解题思路: 简单模拟题,直接用栈进行模拟即可。遇到左括号入栈,遇到右括号或*号时,检查栈顶元素是否匹配。

C++:

#include <iostream>
#include <stack>
#include <string>
using namespace std;

bool isValid(string s) {
    if (s.empty()) return true;
    stack<char> stk;
    
    for (char c : s) {
        if (c == '(' || c == '<') {
            stk.push(c);
        } else if (c == ')') {
            if (stk.empty() || stk.top() != '(') {
                return false;
            }
            stk.pop();
        } else if (c == '>') {
            if (stk.empty() || stk.top() != '<') {
                return false;
            }
            stk.pop();
        } else if (c == '*') {
            if (stk.empty()) {
                return false;
            }
            stk.pop();
        }
    }
    return stk.empty();
}

int main() {
    string s;
    cin >> s;
    if (isValid(s)) {
        cout << "true" << endl;
    } else {
        cout << "false" << endl;
    }
    return 0;
}

Java:

import java.util.Scanner;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        if (isValid(s)) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    }
    
    public static boolean isValid(String s) {
        if(s.isEmpty() || s == null) return true;
        Stack<Character> stk = new Stack<Character>();
        for(char c : s.toCharArray()){
            if(c == '(' || c == '<'){
                stk.push(c);
            }else if(c == ')'){
                if(stk.isEmpty() || stk.pop() != '('){
                    return false;
                }
            }else if(c == '>'){
                if(stk.isEmpty() || stk.pop() != '<'){
                    return false;
                }
            }else if(c == '*'){
                if(stk.isEmpty()){
                    return false;
                }
                stk.pop();
            }
        }
        return stk.isEmpty();
    }
}

Python:

def is_valid(s):
    if not s:
        return True
    
    stack = []
    for c in s:
        if c == '(' or c == '<':
            stack.append(c)
        elif c == ')':
            if not stack or stack.pop() != '(':
                return False
        elif c == '>':
            if not stack or stack.pop() != '<':
                return False
        elif c == '*':
            if not stack:
                return False
            stack.pop()
    
    return len(stack) == 0

s = input()
if is_valid(s):
    print("true")
else:
    print("false")

第二题

给定一个字符串 s 和一个整数 k,s 由大小写字母和数字组成,请找出 s 的一个最长连续子串,使得这个子串中的大小写字母的出现次数都不超过 k。输出这个子串的长度。

输入描述

第一行是一个字符串 s,s 由大小写英文字母、数字组成。 第二行是一个整数 k,表示允许每个字符在子串中出现的最大次数。

输出描述

输出一个整数,表示满足条件的最长子串的长度。

补充说明:

  1. 0≤s.length≤5×10^4
  2. s 由大小写英文字母和数字组成
  3. 1≤k≤100
  4. 大小写字母(不含数字)的出现次数都不超过 k

样例输入

abcabcbb

2

样例输出

6

样例说明

满足条件的最长子串是 "abcabc",其中每个字符('a', 'b', 'c')都出现了恰好 2 次,且不超过 2。因此长度为 6。

参考题解

解题思路: 典型的滑动窗口问题,用两个指针 left 和 right 来定义一个"窗口",即子串 s[left...right]。

C++:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string s;
    int k;
    getline(cin, s);
    cin >> k;
    
    int counts[128] = {0};
    int left = 0;
    int maxLen = 0;
    
    for (int right = 0; right < s.length(); right++) {
        char c = s[right];
        counts[c]++;
        
        while (isalpha(c) && counts[c] > k) {
            char d = s[left];
            counts[d]--;
            left++;
        }
        
        maxLen = max(maxLen, right - left + 1);
    }
    
    cout << maxLen << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int k = in.nextInt();
        
        int[] counts = new int[128];
        int left = 0;
        int maxLen = 0;
        
        for(int right = 0; right < s.length(); right++){
            char c = s.charAt(right);
            counts[c]++;
            
            while(Character.isLetter(c) && counts[c] > k){
                char d = s.charAt(left);
                counts[d]--;
                left++;
            }
            
            maxLen = Math.max(maxLen, right - left + 1);
        }
        
        System.out.println(maxLen);
    }
}

Python:

s = input()
k = int(input())

counts = [0] * 128
left = 0
max_len = 0

for right in range(len(s)):
    c = s[right]
    counts[ord(c)] += 1
    
    while c.isalpha() and counts[ord(c)] > k:
        d = s[left]
        counts[ord(d)] -= 1
        left += 1
    
    max_len = max(max_len, right - left + 1)

print(max_len)

第三题

给定一棵二叉树,每个节点包含一个整数数值(可正可负)。请计算从根节点到叶子节点的所有路径中,路径上所有节点值的乘积为完全平方数的路径数量。

完全平方数是指可以表示为某个整数的平方的数,例如 1、4、9、16 等。注意:0 也是完全平方数(0=0²),负数不能是完全平方数。

输入描述

输入为二叉树的层序遍历序列,空节点用 null 表示。例如,对于如下二叉树:

1 / \ 2 3

其层序遍历输入为:[1,2,3]

输出描述

输出一个整数,表示满足条件的路径数量。

样例输入

[1,4,9]

样例输出

2

参考题解

解题思路: 先将输入的字符串解析成一棵二叉树,然后通过深度优先搜索(DFS)遍历所有从根到叶子的路径,计算路径上节点值的乘积,并判断该乘积是否为完全平方数。

C++:

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
};

int count = 0;

bool isPerfectSquare(long num) {
    if (num < 0) return false;
    if (num == 0) return true;
    long root = (long)sqrt(num);
    return root * root == num;
}

void dfs(TreeNode* node, long curRes) {
    if (node == nullptr) return;
    
    long newRes = curRes * node->val;
    
    if (node->left == nullptr && node->right == nullptr) {
        if (isPerfectSquare(newRes)) {
            count++;
        }
        return;
    }
    
    dfs(node->left, newRes);
    dfs(node->right, newRes);
}

TreeNode* buildTreeNode(string s) {
    s = s.substr(1, s.length() - 2);
    if (s.empty()) return nullptr;
    
    stringstream ss(s);
    string item;
    vector<string> treeArr;
    
    while (getline(ss, item, ',')) {
        item.erase(0, item.find_first_not_of(" "));
        item.erase(item.find_last_not_of(" ") + 1);
        treeArr.push_back(item);
    }
    
    if (treeArr[0] == "null") return nullptr;
    
    TreeNode* root = new TreeNode(stoi(treeArr[0]));
    queue<TreeNode*> nodeQue;
    nodeQue.push(root);
    
    int i = 1;
    while (!nodeQue.empty()) {
        TreeNode* node = nodeQue.front();
        nodeQue.pop();
        
        if (i < treeArr.size()) {
            string leftVal = treeArr[i++];
            if (leftVal != "null") {
                node->left = new TreeNode(stoi(leftVal));
                nodeQue.push(node->left);
            }
        }
        
        if (i < treeArr.size()) {
            string rightVal = treeArr[i++];
            if (rightVal != "null") {
                node->right = new TreeNode(stoi(rightVal));
                nodeQue.push(node->right);
            }
        }
    }
    
    return root;
}

int main() {
    string s;
    getline(cin, s);
    
    TreeNode* root = buildTreeNode(s);
    if (root != nullptr) {
        dfs(root, 1L);
    }
    
    cout << count << endl;
    return 0;
}

Java:

import java.util.Scanner;
import java.util.*;

public class Main {
    private static int count = 0;
    
    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int value) {
            val = value;
        }
    }
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        TreeNode root = buildTreeNode(s);
        int res = countPath(root);
        System.out.println(res);
    }
    
    public static TreeNode buildTreeNode(String s) {
        s = s.trim();
        s = s.substring(1, s.length() - 1);
        if (s.isEmpty()) {
            return null;
        }
        
        String[] treeArr = s.split(",");
        String item = treeArr[0].trim();
        if (item.equals("null")) {
            return null;
        }
        
        TreeNode root = new TreeNode(Integer.parseInt(item));
        Queue<TreeNode> nodeQue = new LinkedList<>();
        nodeQue.add(root);
        
        int i = 1;
        while (!nodeQue.isEmpty()) {
            TreeNode node = nodeQue.poll();
            
            if (i < treeArr.length) {
                String leftVal = treeArr[i++].trim();
                if (!leftVal.equals("null")) {
                    node.left = new TreeNode(Integer.parseInt(leftVal));
                    nodeQue.add(node.left);
                }
            }
            
            if (i < treeArr.length) {
          

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

📍面试公司:紫龙游戏&nbsp;上海🕐面试时间:2025/9/8&nbsp;19:00&nbsp;&nbsp;20min💻面试岗位:游戏测试开发❓面试问题:实习:1.实习中是负责什么模块的?项目有上线吗?2.在项目中有没有遇到过你觉得比较难处理的问题,然后是怎么处理的3.遇到问题/难处理的事情第一时间是怎么去想或者去求助,说一下思路(自己的项目有团队协作前后端联调是吗?[没有],然后就说那我给你一这样一个场景吧)4.场景(1)你拿到一个需求策划,今天中午产品才给你,算上你共三个人;然后你怎么组织/分配工作/做哪些事情,才能让他明天正常的上线(作为测试人)(2)回答基础八股+不同人做不同事情,接上:那你会考虑时间、人员方面的(根据能力不一样的去划分),时间已经很晚了,你还要怎么去做才能让这件事情更顺利一些?在你力所能及的范围内做的。还能不能再想出一些点?(3)明天这个产品正常上线了,但是出了一个问题,你作为统筹的人,这个问题本来属于你回归的范围内,但是测试不是在你这里测试的,第一时间你怎么处理?第二时间你怎么划分是谁的问题(4)在你项目中有没有遇到那些复杂繁琐的问题,比如说做起来是重复的工作,这种情况你会做一些小脚本来方便开发吗?有这样的想法吗?(5)之前有过团队协作的项目吗?你是被安排的那一个吗?举个例子,遇到什么问题你用ai解决会比较顺畅或者说你会哪方面比较好?他给你提供到哪些东西/收获?会在以后你会利用这些经验(6)回到上一个场景,出现了一些问题(问题(3)),你们两个都有责任,让你去复盘它,如何才能让这件事情做的更好,避免你们俩(下一次)出现这些问题5.反问(1)测试和测开的比例?[没有具体划分,看需求,测为主开为辅](2)进去之后负责哪些业务/进哪些组?[进来后划分项目,进入具体的组](3)几轮面试&nbsp;[2技术+1hr]🙌面试感想:被问的有点宕机了,我就一个破实习,我哪有当领导的潜力。真是浪费了我这么高的笔试分因为是邮箱投的简历,(9/12)目前没有任何通知,公众号只显示初试
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

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