网易笔试 网易秋招 网易笔试题 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等多种语言做法集合指南
查看15道真题和解析