网易笔试 网易秋招 网易笔试题 0921
笔试时间:2025年9月21日
往年笔试合集:
第一题
给定一个字符串 s,包含以下字符:(, ), <, > 和 *。其中字符 * 可以变换成 ), > 中的任意一个右括号。判断字符串是否有效,有效字符串需要满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
- 字符 * 只能作为右括号使用,通过变换成合适的类型来匹配左括号。
输入描述
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,表示允许每个字符在子串中出现的最大次数。
输出描述
输出一个整数,表示满足条件的最长子串的长度。
补充说明:
- 0≤s.length≤5×10^4
- s 由大小写英文字母和数字组成
- 1≤k≤100
- 大小写字母(不含数字)的出现次数都不超过 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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南