写在前面
本次给大家带来2026年8月17日蔚来笔试题的2道题,本场机考题目可在咱们平台上在线刷题。
第一题:能消到只剩一个数,当且仅当出现过的数中间没有缺口(从最小到最大每个整数都出现过)。
第二题:从后往前把各条链表接成一条,每条内部顺序不动。
塔子哥的配套刷题网站:codefun2000.com
第1题-读数消融判定
题目内容
产线侧在工位上部署了测点,回传一条长度为 的整型读数序列 。质检模块每次可任选两个不同下标 ():若 ,即两读数相等或恰相差 ,则抹去其中较大的那条;两读数相等时任抹其一。请判断能否经过若干次上述抹除,使序列最终只剩一条读数。
输入描述
第一行一个整型 (),表示随后有 条读数序列。
对其中每一条序列:
第一行一个整型 (),表示该序列长度。 第二行 个正整型 (),表示各测点读数。
请对每条序列逐一判定能否消融到只剩一条读数。
输出描述
共写出 行。对每一条序列,若可以消融到只剩一条读数,写出 YES;否则写出 NO。
示例 1
输入
332 3 425 761 2 2 3 3 4输出
YESNOYES说明
第一条 :选 与 抹去 ,再选 与 抹去 ,剩 。
第二条 :,无法操作,不能消到一条。
第三条 :可先抹去 (与某个 配对),再抹去两个 (分别与 配对),再抹去多余的 (与 配对),最后剩 。
示例 2
输入
248 8 10 931 1 3输出
YESNO说明
第一条:选 与 抹去 ,得到 ;再选 与某个 抹去 ,得到 ;再抹去其中一个 ,剩 。
第二条:只能把两个 配成一对并抹去其中一个,得到 ;此时 ,无法继续,最终剩两条。
题解
解题思路
本题考查值域连通性。每次操作只能选差值绝对值不超过 的两个数,并删掉较大者(相等则删其中一个)。因此:
不会删掉当前更小的数:配对时总是保留较小(或相等)的那个,最后剩下的值一定等于全局最小值。 有缺口就无法交互:若某个整数 在 中从未出现,则小于 的数与大于 的数永远不能配对(差值至少为 ),序列会至少剩两个数。 无缺口则可从大到小剥掉:若 中每个整数都至少出现一次,则当前最大值 必能与 配对并被删掉;重复此过程直到只剩最小值。
因此,答案为 YES 当且仅当出现过的不同读数构成一段连续整数,即 等于不同值的个数。
常见假解:
认为只有 才行:会把 判成 NO。认为只要存在一对 就行:会把 判成 YES。认为只能对下标相邻的位置操作:会把 判成 NO。用 或 模拟搜索配对顺序,在 与 同时取到上限时超时。
复杂度分析
设单条序列长度为 ,值域上界为 ,询问条数为 。
时间复杂度: 扫描求最小、最大并标记出现过的值,再 检查缺口;总体 。 空间复杂度:,用于标记值是否出现。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defcan_reduce(vals):# 不同值构成连续整数 <=> 可以消融到 1 个数 lo = min(vals) hi = max(vals) seen = [False] * (hi - lo + 1)for x in vals: seen[x - lo] = Truefor flag in seen:ifnot flag:returnFalsereturnTruek = int(input())for _ in range(k): n = int(input()) vals = list(map(int, input().split())) print("YES"if can_reduce(vals) else"NO")第2题-洞穴寻路
题目内容
探险队沿洞穴石室寻路,按进入顺序走过 间石室;第 间石室壁上有一条铭文链表 (),节点为铭文编号。出洞时须把沿途铭文收成一条链表带回地面,收纳顺序为后进先出:先接最后一间的 ,再接 ,直到最先进入的 ;每一间内部铭文的先后不变。空石室没有铭文。请给出带回地面的那条链表。
输入描述
读入一行,表示这 条链表,形态为 [{x,y,...},{...},...]。每条链表用花括号按节点顺序列出整型值,彼此以逗号分隔;空链表写成 {}。
,全部节点个数之和不超过 ,节点值为 到 的正整型。
请对这一行输入计算拼接结果。
输出描述
写出一行,即拼接后的链表,形态为 {...};若没有任何节点,写出 {}。
示例 1
输入
[{4,5},{9},{1,1,2}]输出
{1,1,2,9,4,5}说明
三间石室的铭文依次为 、、。出洞后进先出:先接 ,再接 ,再接 。各条内部顺序不改。
示例 2
输入
[{8},{},{2,2}]输出
{2,2,8}说明
中间一间是空石室,回程时直接跳过,结果由 再接 得到。
题解
解题思路
本题考查链表(序列)拼接。输入给出 条链表,要求按下标从后往前依次接到同一条结果上,每条内部顺序不变。
先按题面格式解析出 条序列,空链表对应空序列。 从最后一条开始,向前遍历到第一条,把节点值依次追加到答案中。 空链表不贡献节点,等价于跳过;重复值原样保留,不要去重或排序。
常见假解:
按输入顺序从前往后拼接,得到的是正序而不是逆序; 拼接时把每条链表内部也反转; 把最终结果整体反转(内部顺序会被破坏); 遇到空链表直接报错或丢掉其后的链表。
复杂度分析
设全部节点个数为 ,链表条数为 。
时间复杂度:,每个节点读写常数次。 空间复杂度:,存放解析结果与答案。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defparse_lists(s): inner = s.strip()[1:-1] lists = [] i = 0 n = len(inner)while i < n:if inner[i] == ",": i += 1continue j = i + 1while j < n and inner[j] != "}": j += 1 body = inner[i + 1 : j]# 空花括号表示空链表if body == "": lists.append([])else: lists.append([int(x) for x in body.split(",")]) i = j + 1return listsdefmerge_rev(lists): out = []# 从后往前拼接,内部顺序不变for i in range(len(lists) - 1, -1, -1): out.extend(lists[i])return outdefformat_list(vals):ifnot vals:return"{}"return"{" + ",".join(str(x) for x in vals) + "}"line = input()print(format_list(merge_rev(parse_lists(line))))
夜雨聆风