ARTICLE · 1199970
中国电信10月17日机考笔试题与解析
写在前面
本次给大家带来2026年10月17日中国电信笔试题的3道题,本场机考题目可在咱们平台上在线刷题。
大厂笔试AI Coding练习:CodeFun2000.com/aicoder-gym
第1题-仓库进出停留账
题目内容
一开始仓库里没有任何物品。后面会按给出的先后次序出现 条记录,其中第 条记录所对应的时刻记为 。
记录分成如下两类:
• IN :编号 的物品执行入库。该编号若已处于仓库内,则这条记录不予接受;
• OUT :编号 的物品执行出库。该编号若当前并不处于仓库内,则这条记录不予接受。
每当出库被接受,停留时长定义为:本条记录的时刻,减去该物品最近一回入库被接受时的时刻。需要汇报四个量:被接受的记录一共多少条、不予接受的记录一共多少条、各次被接受的出库其停留时长加总、流程结束后仓库里还剩多少件物品。 不予接受的记录对仓库内容没有任何影响;计算停留时长时,入库时刻只取该物品最近一回真正被接受的那次。
解题思路
仓库一开始是空的。用哈希表记录当前在库物品:键是编号 ,值是该编号最近一次入库被接受的时刻。 按输入顺序处理 条记录。第 条记录( 从 开始)的时刻就是 ,被拒绝的记录同样占一个时刻。 操作是 IN 时:若 已在表中,本条不予接受,且不改表;否则把时刻 写入表中,本条接受。 操作是 OUT 时:若 不在表中,本条不予接受;否则把 减去表中时刻,累加到停留时长,再从表中删掉 ,本条接受。 扫完后,表的大小就是仍在库中的件数。四个整数依次为接受条数、不予接受条数、停留时长之和、在库件数。单次停留不超过 ,但总和可达 ,累加时使用 位整数。
复杂度分析
时间复杂度:。每条记录只做常数次哈希表操作。 空间复杂度:。表中同时存在的编号不超过 。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
# 用哈希表记录在库物品最近一次被接受的入库时刻,扫描全部记录后汇总四个答案defsolve(ops):""" ops 为按输入顺序排列的 (操作, 编号) 列表。 第 i 条(从 0 计)的时刻是 i+1,被拒绝的记录也占用时刻。 返回:接受条数、不予接受条数、成功出库的停留时长之和、结束时在库件数。 """# 键:物品编号;值:最近一次入库被接受的时刻 in_time = {} ok = 0 bad = 0 stay = 0for i, (op, a) in enumerate(ops): p = i + 1if op == "IN":if a in in_time:# 已经在库,本条不改表 bad += 1else: in_time[a] = p ok += 1else:if a notin in_time:# 不在库,无法出库 bad += 1else:# 停留时长 = 当前时刻 - 最近一次成功入库时刻 stay += p - in_time.pop(a) ok += 1return ok, bad, stay, len(in_time)defmain():# 第一行是记录条数 m,后面每行一个操作和编号 m = int(input()) ops = []for _ in range(m): op, num = input().split() ops.append((op, int(num))) ok, bad, stay, left = solve(ops) print(ok, bad, stay, left)if __name__ == "__main__": main()第2题-定长区间和计数
题目内容
小月手头已有一串整数 ,另外还给定了正整数 。她需要查看每一个由连续 项组成的片段,先确定这些片段里元素相加后的最大结果,再清点有多少个片段能得到这个结果。
题解
解题思路
设序列为 ,片段长度为 。需要考察的片段一共有 个,第 个片段是 (下标从 计),答案是这些片段元素和的最大值,以及取到该值的片段个数。 相邻两个片段只相差一项:右端新进入一项,左端离开一项。因此用滑动窗口维护当前片段和,每次更新只要 。 先算出最左边那个片段的和,把它当作当前最大值,次数记为 。窗口每向右走一步,若新和严格更大,就更新最大值并把次数改回 ;若新和恰好等于最大值,次数加 。 元素可为负,片段和就是代数和,不能把负数改成 。当 时只有一个片段,循环体不会执行,答案就是整段之和与次数 。所有项都为负时,最大值仍是这些定长片段里最大的那个和。 最大为 ,单项绝对值最大为 ,片段和最大约为 ,累加时使用 位整数。
复杂度分析
时间复杂度:,每个位置最多进出窗口各一次。 空间复杂度:,用于保存序列;窗口本身只额外占用常数个整数。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defmax_window(m, t, b):"""求长度为 t 的相邻片段的最大元素和,以及达到该和的片段个数。"""# 先把最左边的 t 项加起来,作为第一个片段的和 cur = 0for j in range(t): cur += b[j]# 用第一个片段初始化最大值;此时这个和已经出现 1 次 best = cur cnt = 1# 右端从下标 t 开始向右滑。每走一步,新项进入,最左项离开for j in range(t, m): cur += b[j] cur -= b[j - t]if cur > best:# 出现更大和,次数重新从 1 计 best = cur cnt = 1elif cur == best:# 再次达到当前最大和,次数加 1 cnt += 1return best, cntdefmain():# 读入整数个数 m 与片段长度 t first = input().split() m = int(first[0]) t = int(first[1])# 读入从左到右的 m 个整数 b = list(map(int, input().split())) best, cnt = max_window(m, t, b)# 两个答案写在同一行 print(best, cnt)if __name__ == "__main__": main()第3题-灯塔最远空地
该题原题为P4020腐烂的橘子
题目内容
小月把若干灯塔安在一张矩形格子图上。格子里的 代表灯塔,全部灯塔都从时刻 开始发光;格子里的 代表岩石,光线不能进入;格子里的 代表空地。
每过一分钟,已有光线的格子会把光送到上、下、左、右四个相邻、并且允许进入的格子。某块空地对应的距离,是任意灯塔发出的光第一次抵达该格所花费的分钟数。在所有光线能够抵达的空地中,求出距离的最大值,并统计恰好取到该值的空地有几块。若光线一块空地也到不了,结果写成 。
题解
解题思路
所有字符为 的格子都是灯塔,它们在时刻 同时发光。把这些格子的距离记为 ,一并放进队列,做多源广度优先搜索。 每次只向上、下、左、右走一格。越界、字符为 的岩石,以及已经到达过的格子都不再进入。新格子的距离等于当前格子的距离加 。 搜完以后,只查看字符为 且距离不是 的空地。其中最大的距离就是答案的第一个数,取到这个距离的空地块数是第二个数。 若没有任何空地被光到达,两个数都是 。灯塔本身不是空地,被岩石隔开的 也不计入。
复杂度分析
时间复杂度:。每个格子最多入队一次。 空间复杂度:。需要距离数组和队列。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
# 多源广度优先搜索:所有灯塔同时出发,求可达空地的最远距离及其个数defsolve(grid):""" grid 为 h 行字符串。1 是灯塔,0 是空地,# 是岩石。 返回最远可达空地的距离,以及取到该距离的空地块数。没有可达空地时返回 0 0。 """ h = len(grid) w = len(grid[0])# dist[r][c] 为 -1 表示还没被光到达 dist = [[-1] * w for _ in range(h)] q = [] head = 0for r in range(h):for c in range(w):if grid[r][c] == "1": dist[r][c] = 0 q.append((r, c)) dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))while head < len(q): r, c = q[head] head += 1for dr, dc in dirs: nr, nc = r + dr, c + dc# 越界、岩石、或已经扩散过的格子都跳过if nr < 0or nr >= h or nc < 0or nc >= w:continueif grid[nr][nc] == "#"or dist[nr][nc] >= 0:continue dist[nr][nc] = dist[r][c] + 1 q.append((nr, nc)) best = -1 cnt = 0for r in range(h):for c in range(w):# 只统计字符 0 且确实被光到达的空地if grid[r][c] != "0"or dist[r][c] < 0:continueif dist[r][c] > best: best = dist[r][c] cnt = 1elif dist[r][c] == best: cnt += 1if best < 0:return0, 0return best, cntdefmain():# 第一行是行数 h 和列数 w,后面 h 行是网格 h, w = map(int, input().split()) grid = [input().strip() for _ in range(h)] best, cnt = solve(grid) print(best, cnt)if __name__ == "__main__": main()LeetCode Hot 100 速通教程
Hot 100 是 互联网/国企技术岗高频笔试/手撕的考察题单。我针对每道题做了详细的题解(包含图文解析/动画演示/全语言C++/Python/Java/Go/Js/C解析),并上线了小程序。

各位同学手机打开就能学习👇















































































