华为0830秋招笔试真题解析
- 2026-10-30 19:45:44
关注我们,每周更新两到三次大厂最新笔试题解析
前言
先做第一题的同学可能会比较惨.....
所以以后做题的时候还是先把题目扫一眼比较好,万一看到模板题呢?
总体其实难度不高,不过这场笔试做的同学不多,如果后面的笔试还是这种难度,暑期实习擦边过笔试的同学可能就很危险了,可以考虑是否再做一次笔试(不过也有风险轮到你的那一场就难起来了,要慎重考虑)
智慧打卡系统
某家高科技公司为方便员工省去每日上下班的打卡操作,计划推广使用智慧打卡系统。其运行的原理是系统会记录员工当日进出门禁的时间(员工在上班期间可能会多次进出门禁,格式为24小时制,小时:分钟,“HH:MM”)
现在请编写一个算法,计算员工当日的工作时长(单位:分钟),具体要求如下:
1、单次离岗15min以内,不从工作时长中扣除。
2、12:00至14:00为午休时间,不算工作时长。
3、18:00至19:30为晚饭时间,不算工作明长。
解答要求
时间限制:C/C++1000ms其他语言:2000ms内存限制:C/C++256MB其他语言:512MB
输入
第一行:员工当天进门禁的次数n。
第二行:员工当天进门禁的所有时间,以空格分隔。
第三行:员工当天出门禁的次数m。
第四行:员工当天出门禁的所有时间,以空格分隔。
注:0<n,m<100,不存在相同的出入门禁时间,也不存在连续的出门禁或入门禁的情况。
输出
当日的工作时长。
样例1
输入
5
07:50 08:50 12:30 13:40 19:50
5
08:45 12:20 13:20 18:30 20:30
输出
530
解释:
员工的工作时段为07:50-12:00,14:00~18:00,19:50~20:30,工作时长为530分钟
样例2
输入
4
08:30 12:30 14:00 18:20
12:00 13:00 16:50 19:00
输出
380
解释员工的工作时段为08:30~12:00,14:00~16:50,工作时长为380分钟
思路与代码
模拟题。
最难的一道题了,代码并不优雅,将就看了。核心在于判断:午休和饭点的出入情况。(其实这个题没啥参考价值)
from datetime import datetime
format = "%H:%M"
n = int(input())
intime = [c for c in input().split()]
for i in range(n):
intime[i] = datetime.strptime(intime[i], format)
m = int(input())
outtime = [c for c in input().split()]
for i in range(n):
outtime[i] = datetime.strptime(outtime[i], format)
wuxiu_s, wuxiu_e = datetime.strptime("12:00", format), datetime.strptime("14:00", format)
wanfan_s, wanfan_e = datetime.strptime("18:00", format), datetime.strptime("19:30", format)
res = 0
tmp1 = []
tmp2 = []
tmp = []
#先处理小于15分钟的情况
for i in range(n-1):
if ((intime[i+1] - outtime[i]).total_seconds() / 60) <= 15:
tmp1.append(i+1)
tmp2.append(i)
n1, n2 = [], []
for i in range(n):
if i not in tmp1:
n1.append(intime[i])
if i not in tmp2:
n2.append(outtime[i])
intime, outtime = n1, n2
for i in range(len(intime)):
# 午休前进来 午休后出去
if intime[i] < wuxiu_s and (wuxiu_s < outtime[i] < wuxiu_e or outtime[i] > wuxiu_e) :
res += (wuxiu_s - intime[i]).total_seconds()/60
# 午休进来 午休出去
elif wuxiu_s < intime[i] < wuxiu_e and wuxiu_s < outtime[i] < wuxiu_e : continue
#午休进来 午休后 晚饭前出去
elif wuxiu_s < intime[i] < wuxiu_e and wuxiu_e < outtime[i] < wanfan_s :
res += (outtime[i] - wuxiu_e).total_seconds()/60
# 午休进来 晚饭的时候出去
elif wuxiu_s < intime[i] < wuxiu_e and wanfan_s < outtime[i] < wanfan_e :
res += (wanfan_s - wuxiu_e).total_seconds()/60
#午休进来 晚饭后出去
elif wuxiu_s < intime[i] < wuxiu_e and wanfan_e < outtime[i]:
res += (wanfan_s - wuxiu_e + outtime[i] - wanfan_e).total_seconds()/60
elif intime[i] < wanfan_s and (wanfan_s < outtime[i] < wanfan_e or outtime[i] > wanfan_e) :
res += (wanfan_s - intime[i]).total_seconds()/60
elif wanfan_s < intime[i] < wanfan_e and wanfan_s < outtime[i] < wanfan_e : continue
elif wanfan_s < intime[i] < wanfan_e and outtime[i] > wanfan_e:
res += (outtime[i] - wanfan_e).total_seconds()/60
else:
res += (outtime[i] - intime[i]).total_seconds()/60
print(int(res))
频率搬移值分配
在无线通信设备中通常使用超外差接收机,超外差接收机是利用本地产生的振荡波与输入信号混频,将输入信号频率变换为某个预先确定的频率的方法。也就是说,信号通过一个混频器后,频率就会搬移一个数值。在项目中由于要节省器件,混频器需要尽可能的共享,我们设计了二又树型的混频器组,可以同时把信号搬移到不同的频率上。
二叉树为完全二叉树。我们给定二叉树的层数和从根节点开始到每个子节点的频率搬移总和,输出二叉树。
规则:节点的值为它的所有叶子结点的目标频率最大最小值的平均值(非整数向下取整)减去它所有父节点的总和。
满足:
A+B+D=10
A+B+E=20
A+C+F=30
A+C+G=70
解答要求时间限制:C/C++1000ms其他语言:2000ms 内存限制:C/C++256MB其他语言:512MB
输入
1.叶子节点的数目(必定是 2”,1<= 叶子节点的数目<= 4096
2.每个叶子节点的目标频率值,二又树的数组形式表示,把二又树的结点依次自上而下,自左至右储存到数组中,0<=目标频率值 =1000000
输出
以数组形式的二叉树表示
样例1
输入
4
18 24 2 4
输出
13 8 -10 -3 3 -1 1
解释:第0层:所有叶子节点最大最小值的平均值为(2+24)/2=13 所有父节点值为0,最终为13-0=13
第一层左节点:所有叶子节点最大最小值的平均值为(18+24)/2=21 所有父节点值为13,最终为21-13=8
第1层右节点:所有叶子节点最大最小值的平均值为(2+4)/2=3 所有父节点值为13,最终为3-13=-10
第2层第1个节点:所有叶子节点最大最小值的平均值为18/1=18 所有父节点值为13+8=21,最终为18-21=-3。
第2层第2个节点:所有叶子节点最大最小值的平均值为24/1=24 所有父节点值为13+8=21,最终为24-21=3
第2层第3个节点: 所有叶子节点最大最小值的平均值为2/1=2 所有父节点值为13+(-10)=3,最终为2-3=-1
第2层第4个节点:所有叶子节点最大最小值的平均值为4/1=4 所有父节点值为13+(-10)=3最终为4-3=1
思路与代码
二叉树遍历。
理解清楚题目以后难度并不大,首先算法每个节点对应的叶子节点的最大和最小频率,然后递归计算每一个节点的价值即可。
n = int(input())
leaves = [int(c) for c in input().split()]
tree = [0] * (n*2)
vals = [0] * (n*2)
target = {}
def dfs(node):
if node >= n - 1:
target[node] = [leaves[node-n+1],leaves[node-n+1]]
return target[node]
l,r = dfs(2*node + 1), dfs(2*node + 2)
target[node] = [max(l+r), min(l+r)]
return target[node]
dfs(0)
def dfs2(node, sum):
if node >= 2 * n - 1: return
vals[node] = (target[node][0] + target[node][1]) // 2 - sum
dfs2(node*2+1, sum + vals[node])
dfs2(node*2+2, sum+ vals[node])
dfs2(0, 0)
for i in range(2*n-1):
print(vals[i], end=" ")
内存分配
系统由n个任务组成,任务运行有依赖关系,前序任务执行完毕才可以启动后续任务。任务在启动前申请内存,执行完毕后释放,内存释放后可用于其他任务使用。每个任务的运行时间相等。请计算系统所有任务执行所需要的最小内存。
解答要求
时间限制: C/C++1000ms其他语言: 2000ms内存限制C/C++256MB其他语言:512MB
输入
第1行为1个正整数n,表示任务个数,n<20
第2行为n个正整数,表示每个任务所需要的内存大小,0<内存<1000
第3行为n个取值为0或1的数,表示任务0对其他任务的依赖关系,0表示不依赖,1表示依赖
...
第3+n行为n个取值为0或1的数,表示任务n-1对其他任务的依赖关系,0表示不依赖,1表示依赖
输出
输出系统任务执行所需要的最小内存
样例1
输入
9
50 50 80 40 40 40 60 60 60
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0 0
0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 1 0
输出
120
思路与代码
拓扑排序。
这居然是300分的题目。。。。
拓扑排序,计算拓扑排序每一层的总内存之和的最大值即可。
from collections import deque, defaultdict
n = int(input())
mem = [int(c) for c in input().split()]
graph = defaultdict(list)
indegre = [0]*n
for i in range(n):
tmp = [int(c) for c in input().split()]
for j, s in enumerate(tmp):
if s == 1:
graph[j].append(i)
indegre[i] += 1
q = deque()
for i in range(n):
if indegre[i] == 0:
q.append(i)
res = 0
while q:
size = len(q)
cur = 0
for _ in range(size):
node = q.popleft()
cur += mem[node]
for next in graph[node]:
indegre[next] -= 1
if indegre[next] == 0:
q.append(next)
res = max(res, cur)
print(res)
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)