夜雨聆风学习资料网

ARTICLE · 1199970

中国电信10月17日机考笔试题与解析

中国电信10月17日机考笔试题与解析

写在前面

本次给大家带来2026年10月17日中国电信笔试题的3道题,本场机考题目可在咱们平台上在线刷题。

大厂笔试AI Coding练习:CodeFun2000.com/aicoder-gym

题号
题目
难度(对标leetcode)
核心做法
1
仓库进出停留账
简单
哈希表
2
定长区间和计数
简单
滑动窗口
3
灯塔最远空地
中等
BFS

第1题-仓库进出停留账

题目内容

一开始仓库里没有任何物品。后面会按给出的先后次序出现  条记录,其中第  条记录所对应的时刻记为 。

记录分成如下两类:

• IN :编号  的物品执行入库。该编号若已处于仓库内,则这条记录不予接受;

• OUT :编号  的物品执行出库。该编号若当前并不处于仓库内,则这条记录不予接受。

每当出库被接受,停留时长定义为:本条记录的时刻,减去该物品最近一回入库被接受时的时刻。需要汇报四个量:被接受的记录一共多少条、不予接受的记录一共多少条、各次被接受的出库其停留时长加总、流程结束后仓库里还剩多少件物品。 不予接受的记录对仓库内容没有任何影响;计算停留时长时,入库时刻只取该物品最近一回真正被接受的那次。

解题思路

  1. 仓库一开始是空的。用哈希表记录当前在库物品:键是编号 ,值是该编号最近一次入库被接受的时刻。
  2. 按输入顺序处理  条记录。第  条记录( 从  开始)的时刻就是 ,被拒绝的记录同样占一个时刻。
  3. 操作是 IN 时:若  已在表中,本条不予接受,且不改表;否则把时刻  写入表中,本条接受。
  4. 操作是 OUT 时:若  不在表中,本条不予接受;否则把  减去表中时刻,累加到停留时长,再从表中删掉 ,本条接受。
  5. 扫完后,表的大小就是仍在库中的件数。四个整数依次为接受条数、不予接受条数、停留时长之和、在库件数。单次停留不超过 ,但总和可达 ,累加时使用  位整数。

复杂度分析

  • 时间复杂度:。每条记录只做常数次哈希表操作。
  • 空间复杂度:。表中同时存在的编号不超过 。

代码实现

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题-定长区间和计数

题目内容

小月手头已有一串整数 ,另外还给定了正整数 。她需要查看每一个由连续  项组成的片段,先确定这些片段里元素相加后的最大结果,再清点有多少个片段能得到这个结果。

题解

解题思路

  1. 设序列为 ,片段长度为 。需要考察的片段一共有  个,第  个片段是 (下标从  计),答案是这些片段元素和的最大值,以及取到该值的片段个数。
  2. 相邻两个片段只相差一项:右端新进入一项,左端离开一项。因此用滑动窗口维护当前片段和,每次更新只要 。
  3. 先算出最左边那个片段的和,把它当作当前最大值,次数记为 。窗口每向右走一步,若新和严格更大,就更新最大值并把次数改回 ;若新和恰好等于最大值,次数加 。
  4. 元素可为负,片段和就是代数和,不能把负数改成 。当  时只有一个片段,循环体不会执行,答案就是整段之和与次数 。所有项都为负时,最大值仍是这些定长片段里最大的那个和。
  5.  最大为 ,单项绝对值最大为 ,片段和最大约为 ,累加时使用  位整数。

复杂度分析

  • 时间复杂度:,每个位置最多进出窗口各一次。
  • 空间复杂度:,用于保存序列;窗口本身只额外占用常数个整数。

代码实现

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腐烂的橘子

题目内容

小月把若干灯塔安在一张矩形格子图上。格子里的  代表灯塔,全部灯塔都从时刻  开始发光;格子里的  代表岩石,光线不能进入;格子里的  代表空地。

每过一分钟,已有光线的格子会把光送到上、下、左、右四个相邻、并且允许进入的格子。某块空地对应的距离,是任意灯塔发出的光第一次抵达该格所花费的分钟数。在所有光线能够抵达的空地中,求出距离的最大值,并统计恰好取到该值的空地有几块。若光线一块空地也到不了,结果写成 。

题解

解题思路

  1. 所有字符为  的格子都是灯塔,它们在时刻  同时发光。把这些格子的距离记为 ,一并放进队列,做多源广度优先搜索。
  2. 每次只向上、下、左、右走一格。越界、字符为  的岩石,以及已经到达过的格子都不再进入。新格子的距离等于当前格子的距离加 。
  3. 搜完以后,只查看字符为  且距离不是  的空地。其中最大的距离就是答案的第一个数,取到这个距离的空地块数是第二个数。
  4. 若没有任何空地被光到达,两个数都是 。灯塔本身不是空地,被岩石隔开的  也不计入。

复杂度分析

  • 时间复杂度:。每个格子最多入队一次。
  • 空间复杂度:。需要距离数组和队列。

代码实现

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解析),并上线了小程序。

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

相关学习资料