华为笔试 华为秋招 华为笔试题 1015
笔试时间:2025年10月15日
往年笔试合集:
第一题
有一个故障字符串序列由多行组成,每一行内有多个字符串,分别用空格隔开。现需要对这个字符串序列进行限流显示处理,显示规则如下:
- 输入的第一行为一个数字,表示限流参数
- 从第2行开始为要处理的字符串数据,我们需要将每一行数据流入一个缓存控制器,缓存中的信息包括字符串和其个数信息
- 每行输入数据中的字符串可能在缓存中有重复,如果有重复需要在缓存中对字符串的个数累加
- 每一行流入后需要从当前缓存中取出最早的数据进行输出,取出的数据上限为限流参数,如果数据未取完将继续保存在缓存中,取出的数据将从缓存中删除,后续缓存的相同字符串将重新开始计数
输入描述
输出描述
样例输入
5
abc a b c
ad bc
样例输出
abc 1 a 1 b 1 c 1
null
ad 1 bc 1
样例说明
限制单次输出5个不同字符串。第一行输入为abc a b c,输入后缓存是abc a b c,次数均为1,因此第一行输出是abc 1 a 1 b 1 c 1。第2行输入为空行,之前缓存为空,输入后缓存是空,因此第2行输出为null。第3行输入为ad bc,之前缓存为空,输入后缓存是ad bc,次数均为1,因此第3行输出为ad 1 bc 1。
参考题解
解题思路:
- 维护一个缓存系统,使用队列保存字符串的输入顺序(先进先出)
- 使用字典记录每个字符串的当前计数
- 对于每个输入的字符串:如果已存在则计数+1(队列中位置不变),如果不存在则计数设为1并加入队列末尾
- 输出阶段:从队列头部取出最多n个字符串,输出这些字符串及其计数,并从缓存中删除
C++:
#include <iostream>
#include <unordered_map>
#include <queue>
#include <vector>
#include <sstream>
using namespace std;
int main() {
int x;
cin >> x;
cin.ignore();
unordered_map<string, int> cnt;
queue<string> q;
string line;
while (getline(cin, line)) {
istringstream iss(line);
string word;
vector<string> arr;
while (iss >> word) {
arr.push_back(word);
}
for (const string& t : arr) {
if (cnt.count(t)) {
cnt[t]++;
} else {
cnt[t] = 1;
q.push(t);
}
}
if (x == 0) {
cout << "null" << endl;
continue;
}
int k = min(x, (int)q.size());
if (k == 0) {
cout << "null" << endl;
continue;
}
vector<string> res;
for (int i = 0; i < k; i++) {
res.push_back(q.front());
q.pop();
}
for (int i = 0; i < res.size(); i++) {
if (i > 0) cout << " ";
cout << res[i] << " " << cnt[res[i]];
cnt.erase(res[i]);
}
cout << endl;
}
return 0;
}
Java:
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = Integer.parseInt(scanner.nextLine());
Map<String, Integer> cnt = new HashMap<>();
Queue<String> q = new LinkedList<>();
while (scanner.hasNextLine()) {
String line = scanner.nextLine().trim();
if (line.isEmpty()) {
if (x == 0 || q.isEmpty()) {
System.out.println("null");
}
continue;
}
String[] arr = line.split("\\s+");
for (String t : arr) {
if (cnt.containsKey(t)) {
cnt.put(t, cnt.get(t) + 1);
} else {
cnt.put(t, 1);
q.offer(t);
}
}
if (x == 0) {
System.out.println("null");
continue;
}
int k = Math.min(x, q.size());
if (k == 0) {
System.out.println("null");
continue;
}
List<String> res = new ArrayList<>();
for (int i = 0; i < k; i++) {
res.add(q.poll());
}
StringBuilder out = new StringBuilder();
for (String s : res) {
if (out.length() > 0) out.append(" ");
out.append(s).append(" ").append(cnt.get(s));
cnt.remove(s);
}
System.out.println(out);
}
scanner.close();
}
}
Python:
import sys
from collections import deque
def work():
x = int(sys.stdin.readline().strip())
cnt = {}
q = deque()
while True:
ln = sys.stdin.readline()
ln = ln.strip()
if not ln:
break
arr = ln.split()
for t in arr:
if t in cnt:
cnt[t] += 1
else:
cnt[t] = 1
q.append(t)
if x == 0:
print("null")
continue
k = x if x < len(q) else len(q)
if k == 0:
print("null")
continue
res = []
for i in range(k):
res.append(q.popleft())
out = []
for s in res:
out.append(f"{s} {cnt[s]}")
del cnt[s]
print(" ".join(out))
work()
第二题
网络中有n台路由器,两台路由器之间最多只有一条链路双向连通,每条链路有对应的转发成本。以S为源节点进行转发时,会以S为根基于链路转发成本计算一棵最短路径树,S到其它的报文会沿着最短路径树进行转发。转发的下一跳定义如下:源节点S到目的节点D的最短路径上S的直连的邻居节点,用来指导报文从哪条链路转发。需要注意的是,最短路径树中最短路径可能不止一条,对应转发的下一跳可能存在多个。
任务:给定路由器数量和路由器之间的连通关系及转发成本,并指定两个路由器S、D,计算以D为目的时,S到D的最小转发代价,以及S的转发下一跳的集合。
输入描述
输出描述
样例输入
4 3
1 2 5
1 3 5
2 3 5
1 4
样例输出
-1
-1
样例说明
1作为源路由器,4作为目的路由,1→4路径不可达,最小转发代价为-1,转发下一跳集合为空
参考题解
解题思路:
使用改进的Dijkstra算法求最短路径,特殊处理下一跳信息:
- 初始化源节点S到邻居节点的距离为链路成本,下一跳就是邻居本身
- 当找到更短路径时,下一跳集合继承自前驱节点的下一跳
- 当找到等长路径时,下一跳集合合并前驱节点的下一跳
C++:
#include <iostream>
#include <vector>
#include <queue>
#include <set>
#include <climits>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<vector<pair<int, int>>> g(n + 1);
for (int i = 0; i < k; i++) {
int u, v, c;
cin >> u >> v >> c;
g[u].push_back({v, c});
g[v].push_back({u, c});
}
int s, d;
cin >> s >> d;
if (s == d) {
cout << 0 << "\n-1\n";
return 0;
}
const int INF = INT_MAX;
vector<int> dis(n + 1, INF);
vector<set<int>> nh(n + 1);
dis[s] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, s});
for (auto& [v, c] : g[s]) {
if (dis[v] > c) {
dis[v] = c;
nh[v] = {v};
pq.push({c, v});
} else if (dis[v] == c) {
nh[v].insert(v);
}
}
while (!pq.empty()) {
auto [x, u] = pq.top();
pq.pop();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
查看7道真题和解析