华为0124秋招笔试真题解析
关注我们,每周更新两到三次大厂最新笔试题解析
前言
大家好久不见啦,最近笔试比较少,公众号就没怎么更新。暑期实习和春招会继续陪伴大家的!
华为迎来了秋招的最后一场笔试,难度其实并不大,至少说进面的难度并不大,大家可以参考一下,特别是还在蹲华子春招的同学,一定要珍惜这种真题~
今年秋招的尾巴也是真的长,其他公司也是挺多还在笔面试。所以后面的同学尤其25届,没准备好的明年真不用着急投简历,跟着今年的时间走就大差不差了。
1.计算积分
小明有根绳子,上面穿了很多玻璃球,玻璃球由红绿蓝二种颜色组成,其中红色球1分,绿色球2分,蓝色球3分,现在对同颜色连在一起的球有一个积分奖励规则当这个球与前面1个球颜色相同会给此球奖励1分,当这个球与前面2个球的颜色都相同会给此球奖励2分,以此类推,当这个球与前面3个球的颜色都相同会给此球奖励3分。现在请从前往后计算这串玻璃球的累计分数。其中红色玻璃球用字符r表示,绿色玻璃球用字符g表示,蓝色玻璃球用字符b 表示
解答要求
时间限制: C/C++ 1000ms,其他语言: 2000ms
内存限制: C/C++ 256MB,其他语言: 512MB
输入
1个string由r、g、b组成的字符串
1<=string.length<=10000
输出
经过计算后的得分
样例1
输入:
rgb
输出:
6
解释:
1+2+3=6
样例2
输入:
rrrggb
输出:
14
解释: 1+2 (奖励1分) +3 (奖励2分) +2+3 (奖励1分)+3=14
思路与代码
直接模拟即可。使用一个prec变量记录上一个连续的颜色是什么,cnt来记录连续的长度。
s = input()
dic = {'r':1, 'g':2, 'b':3}
cnt, prec = 0, 'a'
res = 0
for i,c in enumerate(s):
if c == prec:
cnt += 1
res += dic[c] + cnt
else:
cnt = 0
prec = c
res += dic[c]
print(res)
2.大模型训练
AI大模型学习大量的训练样本,通过大量参数拟合出样本背后复杂的高维概率密度分布关系。由于训练数据量越来越大,参数越来越多,模型越来越大,传统超级计算机算力和资源有限无法满足训练需求,假设可通过量了计算机来进行人模型训练现有简化后训练了任务模型列表 tasks, tasks[i] 表示第 i个子任务模型的算力需求,为了保证模型计算的SLA要求所有的子任务模型在T个时刻内完成计算。每个时刻,需按照给出子任务模型的算力需求列表( tasks )顺序调度到量了计算机并完成计算。任意时刻调度的多个了任务模型的算力需求总和不会超过量了计算机可承载的最人算力负荷请返回量了计算机需要提供的最低算力,可在T个时刻内计算完全部子任务模型
解答要求
时间限制: C/C++ 1000ms,其他语言: 2000ms
内存限制: C/C++ 256MB,其他语言: 512MB
输入
输入包括两行,第一行包含2个整数N,T,分别表示子任务模型列表长度,计算全部了任务模型的时刻要求第二行包含N个整数: tasks[1] tasks[2] tasks[3]
... tasks[n] 分别表示第 i个子任务模型的算力需求
注意:
(1) 1 <= T <= N <= 50000
(2) 1 <= tasks[i] <= 500
输出
输出一行,包含一个整数,表示量了计算机需要提供的
最低算力,可在T个时刻内计算完全部子任务模型
样例1
输入:
10 5
1 2 3 4 5 6 7 8 9 10
输出:
15
解释: 量子计算机需要提供的最低算力15,能够满足5个时刻内计算全部子任务模型的需要:时刻1: 1,2.3,4,5;时刻2: 6,7: 时刻3: 8: 时刻4: 9: 时刻5: 10
样例2
输入:
6 3
4 4 2 1 2 3
输出:
6
解释:
量子计算机需要提供的最低算力6,能够满足3个时刻内计算全部子任务模型的需要:时刻1: 4;时刻2: 4,2,时刻3: 1,2,3
样例3
输入:
5 4
1 3 2 1 1
输出:
3
解释: 量子计算机需要提供的最低算力3,能够满足4个时刻内计算全部子任务模型的需要:时刻1: 1,时刻2:3,时刻3: 2,1,时刻4: 1
思路与代码
二分答案的思路。
check函数实际就是一个模拟,尝试累加到无法累加的时候,再重新累加;最后判断划分的时刻数量是否满足小于等于T即可。
N,T = map(int, input().split())
tasks = [int(c) for c in input().split()]
def check(x):
cnt, sum_ = 1, 0
for r in range(N):
if sum_ + tasks[r] <= x:
sum_ += tasks[r]
else:
cnt += 1
sum_ = tasks[r]
return cnt <= T
l,r = max(tasks), 500*50000
while l<r:
mid = (l + r) >> 1
if check(mid): r = mid
else: l = mid + 1
print(r)
3.新能源汽车充电桩建设策略
随着新能源汽车的蓬勃发展,新能源汽车充电桩的覆盖密度越来越重要。某汽车公司建设充电桩的思路如下将一座城市划分为多个区域,每个区域建设一个充电站,充电站内有多个充电桩,充电站之间保持合理的距离,每个充电站可以覆盖相邻范围的多个区域我们使用n来表示区域/充电站的数目,使用stationi]数组表示第i个充电站中充电桩的数目。给定一个范围r,i区域可被邻近r范围内的充电站覆盖,i-j <= n,0 <= i,j<=n - 1,ijl 表示绝对值。因此覆盖区域i的充电桩的包括i区域充电站的充电桩及满足上述覆盖条件i区域充电站的充电桩汽车公司打算在某个城市新增k个充电桩,如何分配这k个充电桩给充电站(k个充电桩可以增加在不同的充电站),以使得所有区域中,被充电桩覆盖最少区域的充电桩数目最大化。
解答要求
时间限制: C/C++ 1000ms,其他语言: 2000ms
内存限制: C/C++ 50MB,其他语言: 100MB
输入
第一行输入为n,表示有n个充电站/区域,取值范围[0,100000)
第二行输入为station[n]数组,表示n个充电站中充电桩的数目[0,100000]
第三行输入为r,表示充电站可覆盖的相邻区域的范围[0,n-1]
第四行输入为k,表示需要新增的充电桩的数目[0,10000000001
输出
输出被充电桩覆盖最少的区域的充电桩的数目
样例1
输入:
5
1 2 4 5 0
1
2
输出:
5
解释: 最优方案之一是把 2 个充电桩都建在充电站1。
每个充电站的充电桩数目分别为1 4 4 50
区域 0的充电桩覆盖数目为 1 + 4 = 5。
区域1的充电桩覆盖数目为 1 + 4 + 4 9
区域 2 的充电桩覆盖数目为 4 + 4 + 5 = 13。
区域3 的充电桩覆盖数目为 5 + 4 = 9
区域 4 的充电桩覆盖数目为 5 + 0 = 5。
充电桩覆盖数目最少是 5
无法得到更优解,所以我们返回 5。
样例2
输入:
4
4 4 4 4
0
3
输出:
4
解释:
无论怎么分配新增的3个充电站,总有一个区域的充电桩覆盖数目是4
思路与代码
二分 + 树状数组 + 贪心。
总体依然是一个二分答案的题目,但是check函数比较复杂。
对于每一个充电站来说,我们可以考虑成一个区间[i-r,i+r],需要满足的是所有的区间的最小值尽可能大,因此我们二分这个最小值。那么如果某个区间小于我们二分的值的时候,此时贪心地将欠缺的充电桩添加到区间的最后一个元素,因为最后一个元素对于后面所有的区间的贡献会最大。
对于每一个区间需要做的就是查询该区间的和,但是由于区间是需要修改的,因此得使用树状数组/线段树进行维护。
n = int(input())
stations = [int(c) for c in input().split()]
R = int(input())
k = int(input())
class BIT:
def __init__(self, n):
self.trees = [0] * (n + 1)
def update(self, index,val):
i = index + 1
while i < len(self.trees):
self.trees[i] += val
i += i & -i
def query(self, x):
cnt = 0
while x:
cnt += self.trees[x]
x -= x & -x
return cnt
def queryRange(self,left,right):
return self.query(right+1)-self.query(left)
def check(x):
#树状数组
bitTree = BIT(n)
for i, station in enumerate(stations):
bitTree.update(i, station)
rest = k
for i,station in enumerate(stations):
# 找到[i-r,i+r]这个范围的和
curSum = bitTree.queryRange(max(0, i-R), min(i+R,n-1))
if curSum <= x:
if rest >= x-curSum:
bitTree.update(i+R,x-curSum)
rest -= x-curSum
else:
return False
return True
l, r = 0, 1000000000
while l < r:
mid = (l + r + 1) >> 1
if check(mid): l = mid
else: r = mid - 1
print(r)
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)