华为0823秋招笔试真题解析
- 2026-10-30 19:43:18
关注我们,每周更新两到三次大厂最新笔试题解析
前言
华子今年第一场的难度出奇的低,比今年上半年的都简单,AK的同学的比例挺多的。
没有什么笔试经验的同学千万不要被题面吓到啦,其实题目还挺简单了。
获取连通的相邻节点列表
在网元内,存在了N个转发节点,每个转发节点有自己唯一的标识TB且每个节点有M个端口,节点间通过端口进行报文通讯。出于业务隔离的需求,服务器内的端口被划分为多个通讯平面(用VLAN隔离,每个VLAN都有一个VLAN ID作为标识):
1、如果两个端口的VLAN ID相同,则说明这两个端口处于同个VLAN,且处于连通状态;
2、如果两个端口的VLANID不同,则说明这两个端口处于不同VLAN,彼此不连通;
现给出节点A的端口数及其各端口所属的VLAN ID,以及节点A相邻的其他节点和端口信息。
要求获取与节点A处于连通状态的所有相邻节点的TB列表(按TB从小到大顺序输出)
输入
第1行:M VLAN_ID_1...VLAN_ID_m
数据间有空格隔开,分别表示:节点A有M个端口,各个端口所属的VLAN_ID,即后面VLAN_ID_m表示第m个端口的VLAN ID。
其中,网元内节点的端口数量M的取值范围为[1,4];端口划分VLAN ID的取值范围为[1,4];
第2行:N
表示与节点A相邻的其他节点有N个,N的取值范围为[0,4000)
第3行开始,将有N行数据,分别描述与节点A相邻的节点的TB和端口信息
输入格式为:TBx Mx VLAN_ID_xx...VLAN_ID_xm
数据间有空格隔开,分别表示: 节点x的TBx,有Mx个端口,各个端口所属的VLAN_ID,即后面VLAN_ID_xm表示第m个端口的VLAN ID。
其中,网元内节点TB的取值范围为(0,4294967295);
输出
第1行:N
表示与节点A连通的相邻节点个数,如 N为0,则无需在输出其他信息
第2行:TB_1...TB_n
数据间有空格隔开,分别表示:与节点A连通的相邻节点的TB,个数为N,按从小到大的顺序输出。
样例1
输入
1 1
3
1024 2 1 2
1023 1 1
1025 3 2 2 3
输出
2
1023 1024
解释TB为1025的节点,其端口与节点A的端口均不在一个VLAN内,故与节点A不连通
TB为1024和1023的节点,均有端口与节点A的端口在VLAN ID为1的VLAN内,故与节点A连通
思路与代码
哈希表模拟(打卡题)。
将A节点的VLAND节点加入哈希表,判断其他节点的VLAND是否存在于哈希表中即可。但是卡200ms。。。。
import java.io.*;
import java.util.*;
public class Main{
static PrintWriter print = new PrintWriter(new OutputStreamWriter(System.out));
static FastScanner in = new FastScanner(System.in);
public static void main(String[] args) {
Set<Long> set = new HashSet<>();
int M = in.nextInt();
for (int i = 0; i < M; i++) {
long a = in.nextLong();
set.add(a);
}
int N = sc.nextInt();
List<Long> nodes = new ArrayList<>();
for (int i = 0; i < N; i++) {
long TB = in.nextLong();
long Mx = in.nextLong();
boolean flag = false;
for (long l = 0; l < Mx; l++) {
long VLAND = in.nextLong();
if (set.contains(VLAND)) {
flag = true;
}
}
if (flag) nodes.add(TB);
}
Collections.sort(nodes);
if (nodes.size() > 0) {
print.println(nodes.size());
for (Long re : nodes) {
print.print(re + " ");
}
}
else print.println(0);
print.flush();
}
private static class FastScanner {
BufferedReader br;
StringTokenizer st;
public FastScanner(InputStream stream){
br = new BufferedReader(new InputStreamReader(stream), 32768);
st = null;
}
String next() {
while (st == null || !st.hasMoreTokens())
try {
st=new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
int[] readArray(int n) {
int[] a=new int[n];
for (int i=0; i<n; i++) a[i]=nextInt();
return a;
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble(){return Double.parseDouble(next());}
}
}
字符串处理器
产品代码需要设计一个带游标的字符串处理器,它需要实现以下功能:
插入:在游标所在处添加文本,其对应操作为insert str,insert表示插入操作命令关键字 (区分大小写),str表示待操作的字符串,insert操作执行后将str拼接到游标当前位置,同时游标移动到str的右边;
删除:在游标所在处删除文本,其对应操作为delete len,delete表示删除操作命令关键字(区分大小写),len为整数,表示删除游标左边字符串的长度,此时len要求大于等于0,如果len小于或len大于字符串长度,认为输入命名非法,不做任何处理;
移动:将游标往左或者往右移动,其对应操move cnt,move表示游标移动操作命令关键字(区分大小写),cnt为整数,表示游标移动次数,cnt如果为负数时表示向左移动cnt次,如果为正数表示向右移动cnt次数,如果cnt等于0,则表示游标不移动,如果移动次数cnt超过字符串左右边界则认为输入命名非法,不做任何处理:
复制:将游标左边字符串复制并插入到游标的右边,游标位置不变(如果游标右边有字符,复制插入到游标和原有字符中间),其对应操作为copy,copy表示复制操作命令关键字(区分大小写):
解答要求
时间限制: C/C++ 1000ms,其他语言: 2000ms内存限制: C/C++256MB,其他语言: 512MB
输入
支持输入多行,每个仅支持输入一个操作命令,当输入end结束操作命令关键字(区分大小写)时则代表操作停止。
首次执行时字符串处理器内部字符串为空,游标位置索引为0,此时字 符串处理器序列化结果为1。
1 <= str.length<= 40
1 <= len<= 40
-40 <= cnt<= 40
调用insert,delete,move和oopy的总次数不超过200次。
输出
当前字符串处理器的序列化结果,游标使用“i”来表示。
样例2
输入
insert test
insert hellohuawei
move -6
delete 5
insert practice
copy
end
输出
testpractice|testpracticehuawei
思路与代码
字符串模拟即可。
注意边界。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String res = "";
int pos = 0; //游标
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.nextLine();
if (str.equals("end")) break;
String[] strs = str.split(" ");
if (strs[0].equals("insert")) {
res = res.substring(0, pos) + strs[1] + res.substring(pos);
pos += strs[1].length();
} else if (strs[0].equals("delete")) {
int _len = Integer.parseInt(strs[1]);
if (_len < 0 || _len > pos) continue;
res = res.substring(0, pos - _len) + res.substring(pos);
pos = pos - _len;
} else if (strs[0].equals("move")) {
int cnt = Integer.parseInt(strs[1]);
if ((cnt < 0 && pos + cnt < 0) || (cnt > 0 && pos + cnt > res.length())) continue;
pos += cnt;
} else if (strs[0].equals("copy")) {
res = res.substring(0, pos) + res.substring(0, pos) + res.substring(pos);
}
}
System.out.println(res.substring(0, pos) + "|" + res.substring(pos));
}
}
消息传输
在给定的 mxn 网格地图grid中,分布看一些信号塔,用来各区域间通信,每个单元格可以有以下三个状态:
值0代表空地,无法传递信号;
值1代表信号塔A,在收到消息后,信号塔A在1ms后可以将信号发送给上下左右四个方向的信号塔;
值2代表信号塔B,在收到消息后,信号塔B在2ms后可以将信号发送给上下左右四个方向的信号塔,
先给定一个坐标(j,k)输入保证坐标 (j,k)位置一定有信号塔,在坐标(,k)位置的信号塔触发一个信号
返回 网格地图中所有信号塔收到信号的最小时间,单位为ms。如果不可能,返回-1。
解答要求时间限制:C/C++100ms,其他语言: 200ms 内存限制:C/C++32MB,其他语言: 64MB
输入
网格的列数n
网格的行数m
触发信号的信号塔坐标(j,k)
第0行网格n个位置的信号塔安装信息(通过空格间隔每个状态值)
第m-1行网格n个位置的信号塔安装信息
输出返回 网格地图中所有信号塔收到信号的最小时间,单位为ms。如果不可能,返回-1。
样例1
输入
3
3
1 0
0 1 2
1 2 1
0 1 2
输出
4
解释:
在给定3x3的网格中,坐标(1,0)位置信号塔产生的信号经过4ms就可以传播给所有信号塔
思路与代码
迪杰斯特拉。
卡200ms,但是数据特别小,所以直接搜就行。
public class Main {
public static void main(String[] args) {
new Main().solve();
}
int m, n;
int[][] matrix;
void solve() {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
matrix = new int[m][n];
int sx = in.nextInt();
int sy = in.nextInt();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = in.nextInt();
}
}
PriorityQueue<int[]> q = new PriorityQueue<>((a,b)->a[0] - b[0]);
int[][] DIS = new int[m][n];
for (int i = 0; i < m; i++) Arrays.fill(DIS[i], 1000001);
boolean[][] vst = new boolean[m][n];
q.add(new int[]{0, sx, sy});
DIS[sx][sy] = 0;
int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
while (!q.isEmpty()) {
int[] arr = q.poll();
int i = arr[1], j = arr[2];
if (vst[i][j])continue;
vst[i][j] = true;
for (int[] d : dirs) {
int ni = i + d[0], nj = j + d[1];
if (ni < 0 || nj < 0 || ni >= m || nj >= n || matrix[ni][nj] == 0) continue;
if (DIS[ni][nj] > DIS[i][j] + matrix[i][j]) {
DIS[ni][nj] = DIS[i][j] + matrix[i][j];
q.add(new int[]{DIS[ni][nj], ni, nj});
}
}
}
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] != 0)res = Math.max(res, DIS[i][j]);
}
}
if (res != Integer.MAX_VALUE)System.out.println(res);
else System.out.println(-1);
}
}
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)