2026年华为软件开发工程师校招笔试模拟题及答案.docxVIP

  • 0
  • 0
  • 约7.48千字
  • 约 18页
  • 2026-03-17 发布于未知
  • 举报

2026年华为软件开发工程师校招笔试模拟题及答案.docx

2026年华为软件开发工程师校招笔试模拟题及答案

编程题(25分)

题目描述:某5G基站在连续n秒内采集了信号强度数据,存储为数组`signal`(元素为整数)。现需找出所有长度为k的连续子数组中,信号强度波动最小的那个子数组(波动定义为子数组最大值与最小值的差)。若有多个波动相同的子数组,返回起始索引最小的那个。

输入:第一行两个整数n和k(2≤k≤n≤10^5);第二行n个整数,表示signal数组。

输出:一个整数,即目标子数组的起始索引(索引从0开始)。

示例输入:

63

314256

示例输出:

1

解答思路:

要高效计算滑动窗口内的最大值和最小值,常规的遍历每个窗口并排序的方法时间复杂度为O(nk),无法处理n=1e5的情况。因此需使用双端队列(单调队列)维护窗口内的极值。具体步骤如下:

1.维护最大值队列:队列头部为当前窗口最大值的索引。新元素进入窗口时,若队列尾部元素小于等于当前元素,则弹出尾部(因为这些元素不可能成为后续窗口的最大值),再将当前元素索引加入队列。同时,若队列头部索引超出窗口左边界,弹出头部。

2.维护最小值队列:逻辑类似,队列头部为当前窗口最小值的索引,新元素进入窗口时,弹出尾部大于等于当前元素的索引。

3.遍历窗口:从第k-1个元素开始(窗口首次完整),计算每个窗口的波动(最大值-最小值),记录最小波动对应的起始索引。

代码实现:

```python

deffind_min_fluctuation(n,k,signal):

fromcollectionsimportdeque

max_q=deque()

min_q=deque()

min_fluctuation=float(inf)

result=0

foriinrange(n):

维护最大值队列

whilemax_qandsignal[i]=signal[max_q[-1]]:

max_q.pop()

max_q.append(i)

维护最小值队列

whilemin_qandsignal[i]=signal[min_q[-1]]:

min_q.pop()

min_q.append(i)

窗口左边界超出队列头部时,弹出

whilemax_q[0]=i-k:

max_q.popleft()

whilemin_q[0]=i-k:

min_q.popleft()

当窗口长度达到k时计算波动

ifi=k-1:

current_fluctuation=signal[max_q[0]]-signal[min_q[0]]

ifcurrent_fluctuationmin_fluctuation:

min_fluctuation=current_fluctuation

result=i-k+1起始索引为i-k+1

elifcurrent_fluctuation==min_fluctuation:

取起始索引更小的

result=min(result,i-k+1)

returnresult

测试示例

n,k=6,3

signal=[3,1,4,2,5,6]

print(find_min_fluctuation(n,k,signal))输出1

```

复杂度分析:每个元素最多入队和出队一次,时间复杂度为O(n),空间复杂度O(k)。

算法设计题(30分)

题目描述:华为物联网平台每日接收10亿条设备上报的时间戳(单位:毫秒,类型为long),需对这些时间戳进行去重并排序。要求:

-内存限制:不超过2GB(假设可用内存为2GB,系统其他进程占用500MB);

-输出:排序后的去重时间戳列表。

解答要求:

1.设计具体的处理流程;

2.说明关键步骤的实现方法;

3.分析时间复杂度和空间复杂度。

解答思路:

10亿条时间戳,每条占8字节

文档评论(0)

1亿VIP精品文档

相关文档