乐于分享
好东西不私藏

京东机考数据分析岗8月8日笔试题与解析

京东机考数据分析岗8月8日笔试题与解析

写在前面

本次给大家带来2026年8月8日京东数据分析岗笔试题的3道题,本场机考题目可在咱们平台上在线刷题。

第一题:枚举  作为“保留部分最大评级”和“删除部分最小评级”的分界值,判断两部分的目标和是否能在各自取值范围内实现,找到可行分界后再用贪心分配评级即可。

第二题:通过交换论证可知最优编排必须让编号相近的方案递归聚在同一半区,因此最优对阵树结构唯一,而每个内部节点都可独立交换左右子树,所以答案为 

第三题:联表按批次 GROUP BY,用条件聚合统计任务总数、异常任务数(!= PASS 或 actual < plan)和少检量,HAVING 筛出有异常的批次,按多列排序输出。

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

题号
题目
难度(对标leetcode)
核心做法
1
等级序列还原
中等
暴力枚举
2
单败淘汰赛概率
困难
数学
3
产线质检异常批次统计
中等
模拟

第1题-等级序列还原

题目内容

产线质检得到  件工件的质量评级序列 ,每件评级为  至  级之间的整数,评级总和记为 

随后质检流程升级,评级最高的  件工件被召回重测(若存在多件最高评级,召回其中任意  件),召回后剩余  件的评级总和记为 。已知 

现在只知道四个整数 ,请还原出一组可能的原始评级序列 ,满足:

  • 每个 
  • 总和等于 
  • 剔除评级最高的  件后,剩余  件的和等于 

若不存在满足条件的序列,输出 

输入描述

在一行上输入四个整数 )。

输出描述

如果有解,输出一行  个整数,代表任意一个合法评级序列(顺序任意);

无解则输出 

样例1

输入

4 2 15 5

输出

1 4 5 5

说明

评级总和 ,召回最高的  件后剩余  件和 。被召回的  件评级均为 ,每件  级。剩余  件和为 ,分别取  级和  级,完整序列 

样例2

输入

3 1 10 6

输出

2 4 4

说明

总和 ,召回最高  件后剩余  件和 。被召回那件评级  级。剩余  件和为 ,分别取  级和  级,完整序列  时召回一件  级,剩余一件  级与一件  级。

样例3

输入

3 1 10 2

输出

-1

说明

被召回那件评级应为  级,超出  的范围,故无解。

题解

解题思路

设剩余工件数量为 ,被召回的  件工件评级和为:

因为被召回的是评级最高的  件,所以一定存在一个分界评级 ,满足:

  • 剩余的  件评级都在 
  • 被召回的  件评级都在 

评级相同时可以任意选择,因此两部分都出现评级  是允许的。

评级只有  到 ,所以直接枚举分界值 

对于某个 

剩余  件每件至少为 ,至多为 ,因此必须满足:

被召回的  件每件至少为 ,至多为 ,因此必须满足:

只要存在一个  同时满足这两个条件,就一定可以构造答案。

构造时:

  • 剩余部分先全部赋值为 ,再把多出的  依次分配,每个位置最多增加到 
  • 召回部分先全部赋值为 ,再把多出的  依次分配,每个位置最多增加到 

这样剩余部分所有评级都不超过 ,召回部分所有评级都不小于 ,所以后面的  个元素一定可以作为最高的  件被召回。

如果枚举完  到  都无法满足条件,则无解。

使用的算法为枚举与贪心构造。

复杂度分析

分界值  只有  种可能,枚举部分为常数复杂度。

构造答案需要生成  个评级,因此:

  • 时间复杂度:
  • 空间复杂度:

能够满足  的数据范围。

代码实现

python代码(C++和JAVA代码见在线OJ网址)

defconstruct(n, k, S, R):    m = n - k    T = S - R# 枚举两部分评级的分界值for c in range(17):if m <= R <= m * c and k * c <= T <= 6 * k:            ans = []# 构造剩余的 m 件,评级范围为 [1, c]            rest = R - mfor _ in range(m):                add = min(rest, c - 1)                ans.append(1 + add)                rest -= add# 构造被召回的 k 件,评级范围为 [c, 6]            rest = T - k * cfor _ in range(k):                add = min(rest, 6 - c)                ans.append(c + add)                rest -= addreturn ansreturnNonedefmain():    n, k, S, R = map(int, input().split())    ans = construct(n, k, S, R)if ans isNone:        print(-1)else:        print(*ans)if __name__ == "__main__":    main()

第2题-单败淘汰赛概率

题目内容

某团队有  个候选方案参与逐轮两两对比淘汰评审,方案编号依次为  到 。每个方案的优先级评分即为其编号(评分越高的方案越优)。在任一轮对比中,若编号为  的方案与编号为  的方案被分到一起,则方案  胜出的概率为:

具体评审流程如下:

  • 首轮,所有方案按初始编排顺序两两配对:位置  的方案与位置  的方案对比,位置  的方案与位置  的方案对比,……,位置  的方案与位置  的方案对比。(注意:位置  上的方案编号不一定是 
  • 后续各轮,将上一轮胜出的方案按胜出先后排成一行,再次依次每两个配对(位置  与  对比,位置  与  对比,……),胜者进入下一轮,直至产生唯一胜者。

初始编排是一个长度为  的排列,每个方案恰好出现一次,且顺序决定首轮配对关系。请计算:共有多少种不同的初始编排顺序,能使编号为  的方案最终胜出的概率达到最大值。答案请对  取模后输出。

【名词解释】

长度为  的排列:由  这  个整数按任意顺序组成的数组,每个整数恰好出现一次。例如, 是一个长度为  的排列,而  和  都不是排列——前者存在重复元素 ,后者包含超出范围的数 

输入描述

读入一行一个整数 )。

输出描述

输出一行一个非负整数,表示答案对  取模后的结果。

样例1

输入

2

输出

8

说明

 时共有  个方案(编号 ),全部  种编排。考察一种使方案  胜出概率最大的典型编排 

  • 首轮:方案  与方案  对比,胜出概率 
  • 首轮另一组:方案  与方案  对比, 胜出概率  胜出概率 
  • 终轮:方案  若对 ,胜出概率 ;若对 ,胜出概率 
  • 综合概率:

该概率即为所有编排中方案  胜出的最大可能值。经枚举验证,恰有  种不同的初始编排可达该上界,故输出 

样例2

输入

3

输出

128

题解

解题思路

设方案总数为

把整个淘汰赛看成一棵固定的完全二叉树,排列就是把编号放到这棵树的叶子上。

核心结论是:

最优编排中,编号必须按照大小“相邻聚集”:第一轮为 ,再将  聚在一起,继续递归。 也就是说,每个内部节点对应一个连续编号区间,它的两个儿子分别对应这个区间较小的一半和较大的一半。

例如  时,唯一的最优对阵结构为

然后

最后两部分相遇。

为什么如此?

考虑四个编号

如果要让最弱的  最终胜出,比较三种配对方式。

相邻配对为

与交叉配对

相比,两者中  最终胜出的概率之差为

与另一种配对

相比,同样有严格正的差值。

因此,想保护较弱的方案,就应该让较弱的方案彼此先淘汰,同时让较强的方案彼此先淘汰。

对于一个之后要与更弱方案  对决的子树也是一样。若

设这四个方案最终产生冠军 ,我们关心

直接比较三种配对,其差可以整理成

其中  均为正数。因此仍然是

最优。

于是通过交换法不断消除交叉配对,可知最优结构必须递归地将连续编号分成较小的一半和较大的一半。

由于所有编号互不相同,上面的不等式都是严格的,所以除了交换某个节点的左右子树外,不存在其他最优结构。

接下来只需要计数。

一棵有  个叶子的满二叉树恰好有

个内部节点。

对于每个内部节点,都可以独立交换它的左右子树。交换后对阵关系完全相同,只是初始排列顺序不同。

因此最优排列数量为

最终使用快速幂计算

例如:

  •  时,答案为 
  •  时,答案为 

复杂度分析

令 

使用快速幂计算 

  • 时间复杂度:
  • 空间复杂度:

代码实现

python代码(C++和JAVA代码见在线OJ网址)

MOD = 998244353defsolve(m):# 方案总数    n = 1 << m# 最优排列数为 2^(n-1)return pow(2, n - 1, MOD)if __name__ == "__main__":    m = int(input())    print(solve(m))

第3题-产线质检异常批次统计

题目内容

产线质检系统对各批次产品进行抽检,系统内记录了每个批次的抽检任务及执行结果。请使用  编写  查询语句,统计  年  月  日存在质检异常的生产批次。

表名:

字段
类型
说明
batch_id
int
批次 ID
prod_line
varchar()
产线编码
batch_date
date
批次日期

表名:

字段
类型
说明
inspect_id
int
抽检任务 ID
batch_id
int
批次 ID
plan_cnt
int
计划抽检数量
actual_cnt
int
实际抽检数量
inspect_status
varchar()
抽检状态,取值包括 PASS、TODO、ING

质检异常任务指未合格的任务,或实际抽检数量少于计划抽检数量的任务。请输出存在至少  个异常任务的批次。 输出字段固定为:。列名和列顺序必须与要求一致。

其中  表示该批次的抽检任务总数; 表示异常任务数量; 表示该批次中所有少检数量之和,未少检的任务不计入少检数量。

结果先按  降序排列;若相同,按  降序排列;若相同,按  升序排列;若仍相同,按  升序排列。

样例1

输入

CREATETABLE inspection_batches (batch_id int,prod_line varchar(20),batch_date date);CREATETABLE inspection_tasks (inspect_id int,batch_id int,plan_cnt int,actual_cnt int,inspect_status varchar(20));INSERTINTO inspection_batches VALUES(201'A01''2026-10-01'),(202'A01''2026-10-01'),(203'B01''2026-10-01'),(204'A01''2026-09-30');INSERTINTO inspection_tasks VALUES(12011212'PASS'),(220194'PASS'),(320177'TODO'),(420266'PASS'),(520255'PASS'),(6203102'TODO'),(720388'PASS');

输出

prod_line
batch_id
task_cnt
abnormal_cnt
shortfall
A01
201
3
2
5
B01
203
2
1
8

说明

 任务:

任务 ,正常;

任务 ,实际少于计划,异常,少检 

任务  未合格,异常,无少检数量; 总 

 任务:

任务  未合格,,异常,少检 

任务  正常;

 全部任务正常,不输出。

 批次日期为  年  月  日,不在统计范围内,不输出。

样例2

输入

CREATETABLE inspection_batches (batch_id int,prod_line varchar(20),batch_date date);CREATETABLE inspection_tasks (inspect_id int,batch_id int,plan_cnt int,actual_cnt int,inspect_status varchar(20));INSERTINTO inspection_batches VALUES(301'C01''2026-10-01'),(302'C01''2026-10-01');INSERTINTO inspection_tasks VALUES(11301108'PASS'),(1230166'ING'),(1330244'PASS'),(1430277'PASS');

输出

prod_line
batch_id
task_cnt
abnormal_cnt
shortfall
C01
301
2
2
2

说明

 任务:

任务 ,实际少于计划,异常,少检 

任务  未合格,异常,无少检数量;

 两个任务均合格且数量达标,无异常,不输出。

注:不需要考虑输入异常情况。

解题思路

先将 inspection_batches 与 inspection_tasks 按 batch_id 连接,并筛选 2026-10-01 的批次,然后按批次分组统计:

  • task_cnt:该批次任务总数;
  • abnormal_cnt:满足 inspect_status <> 'PASS' 或 actual_cnt < plan_cnt 的任务数量;
  • shortfall:累加 plan_cnt - actual_cnt 的正数部分;
  • 最后使用 HAVING 只保留至少存在  个异常任务的批次,并按照题目要求排序。

SQL 实现

SELECT    b.prod_line,    b.batch_id,COUNT(*) AS task_cnt,SUM(CASEWHEN t.inspect_status <> 'PASS'OR t.actual_cnt < t.plan_cntTHEN1ELSE0END    ) AS abnormal_cnt,SUM(CASEWHEN t.actual_cnt < t.plan_cntTHEN t.plan_cnt - t.actual_cntELSE0END    ) AS shortfallFROM inspection_batches AS bJOIN inspection_tasks AS tON b.batch_id = t.batch_idWHERE b.batch_date = '2026-10-01'GROUPBY    b.prod_line,    b.batch_idHAVING abnormal_cnt > 0ORDERBY    abnormal_cnt DESC,    shortfall DESC,    prod_line ASC,    batch_id ASC;
最后欢迎大家加入我的秋招交流群,讨论求职相关问题(备注:加群)