乐于分享
好东西不私藏

蔚来机考8月17日笔试题与解析

蔚来机考8月17日笔试题与解析

写在前面

本次给大家带来2026年8月17日蔚来笔试题的2道题,本场机考题目可在咱们平台上在线刷题。

第一题:能消到只剩一个数,当且仅当出现过的数中间没有缺口(从最小到最大每个整数都出现过)。

第二题:从后往前把各条链表接成一条,每条内部顺序不动。

塔子哥的配套刷题网站:codefun2000.com

题号
题目
难度(对标leetcode)
核心做法
1
读数消融判定
简单
模拟
2
洞穴寻路
简单
链表

第1题-读数消融判定

题目内容

产线侧在工位上部署了测点,回传一条长度为  的整型读数序列 。质检模块每次可任选两个不同下标 ):若 ,即两读数相等或恰相差 ,则抹去其中较大的那条;两读数相等时任抹其一。请判断能否经过若干次上述抹除,使序列最终只剩一条读数。

输入描述

第一行一个整型 ),表示随后有  条读数序列。

对其中每一条序列:

  • 第一行一个整型 ),表示该序列长度。
  • 第二行  个正整型 ),表示各测点读数。

请对每条序列逐一判定能否消融到只剩一条读数。

输出描述

共写出  行。对每一条序列,若可以消融到只剩一条读数,写出 YES;否则写出 NO

示例 1

输入

332 3 425 761 2 2 3 3 4

输出

YESNOYES

说明

第一条 :选  与  抹去 ,再选  与  抹去 ,剩 

第二条 ,无法操作,不能消到一条。

第三条 :可先抹去 (与某个  配对),再抹去两个 (分别与  配对),再抹去多余的 (与  配对),最后剩 

示例 2

输入

248 8 10 931 1 3

输出

YESNO

说明

第一条:选  与  抹去 ,得到 ;再选  与某个  抹去 ,得到 ;再抹去其中一个 ,剩 

第二条:只能把两个  配成一对并抹去其中一个,得到 ;此时 ,无法继续,最终剩两条。

题解

解题思路

本题考查值域连通性。每次操作只能选差值绝对值不超过  的两个数,并删掉较大者(相等则删其中一个)。因此:

  1. 不会删掉当前更小的数:配对时总是保留较小(或相等)的那个,最后剩下的值一定等于全局最小值。
  2. 有缺口就无法交互:若某个整数  在  中从未出现,则小于  的数与大于  的数永远不能配对(差值至少为 ),序列会至少剩两个数。
  3. 无缺口则可从大到小剥掉:若  中每个整数都至少出现一次,则当前最大值  必能与  配对并被删掉;重复此过程直到只剩最小值。

因此,答案为 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}

说明

中间一间是空石室,回程时直接跳过,结果由  再接  得到。

题解

解题思路

本题考查链表(序列)拼接。输入给出  条链表,要求按下标从后往前依次接到同一条结果上,每条内部顺序不变。

  1. 先按题面格式解析出  条序列,空链表对应空序列。
  2. 从最后一条开始,向前遍历到第一条,把节点值依次追加到答案中。
  3. 空链表不贡献节点,等价于跳过;重复值原样保留,不要去重或排序。

常见假解:

  • 按输入顺序从前往后拼接,得到的是正序而不是逆序;
  • 拼接时把每条链表内部也反转;
  • 把最终结果整体反转(内部顺序会被破坏);
  • 遇到空链表直接报错或丢掉其后的链表。

复杂度分析

设全部节点个数为 ,链表条数为 

  • 时间复杂度:,每个节点读写常数次。
  • 空间复杂度:,存放解析结果与答案。

代码实现

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))))
最后欢迎大家加入我的秋招交流群,讨论求职相关问题(备注:加群)