【笔试刷题】京东-2026.03.28-第一套-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
京东-2026.03.28-第一套
京东-2026.03.28-第一套
这套题一眼看上去都不算重,但都需要先把问题本质抽出来。第一题其实不是模拟扩容,而是定位路径;第二题则是标准的双源最短路枚举会合点。
题目一:扩容生成器的定位值
关键不是把数组真的展开,而是判断目标位置在每一层落到左半还是右半。把这个过程翻成二进制以后,答案直接化成 。
难度:中等
题目二:传送后的最短会合步数
每次只操作一个人,等价于各自走到同一个会合点。分别从 和
做一次 BFS,再把两段距离相加取最小值即可。
难度:中等
1. 扩容生成器的定位值
问题描述
小基 在测试一台扩容生成器。起初,设备里只有一个整数 。
对于任意一个整数数组 ,定义:
inc(A):把中每个元素都加
。
A * B:先写下数组,再紧接着写下数组
。
生成器每执行一轮,都会把当前数组 替换成:
inc(A) * A
现在一共执行 轮扩容。请计算最终数组中第
个位置上的值。
位置编号从 开始。
输入格式
输入一行三个整数 、
、
。
输出格式
输出一个整数,表示扩容 轮后,第
个位置上的值。
样例输入
2 4 11
样例输出
4
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 | 扩容 |
题解
关键观察
第 轮扩容得到的数组,会被自然地拆成两半:
- 左半段是上一轮整体加
之后的结果。
- 右半段是上一轮原样保留的结果。
所以如果只关心“第 个位置的值”,根本不需要真的把整个数组展开出来。
从第 轮一路往前追:
- 如果当前位置落在左半段,答案就会额外加
。
- 如果当前位置落在右半段,答案不会变化,只是把位置映射回上一轮。
一直追到第 轮时,数组里只剩下初值
。
为什么能直接写成公式
长度为 的数组,可以把位置看成一条长度为
的“向左或向右”的路径。
把 写成二进制后:
- 二进制里的
表示这一层落在右半段。
- 二进制里的
表示这一层落在左半段。
因此,答案就是:
- 初始值
- 再加上“落在左半段的次数”
而左半段次数恰好等于 。
所以最终公式为:
复杂度分析
只需要统计一次二进制中 的个数。
- 时间复杂度:
。
- 空间复杂度:
。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
x, n, k = map(int, input().split())
# k-1 的 n 位二进制里,0 的个数就是落在左半段的次数。
add = n - (k - 1).bit_count()
print(x + add)
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long x;
int n;
unsigned long long k;
cin >> x >> n >> k;
// 统计 k-1 中 1 的个数,再用 n 减掉它。
long long add = n - __builtin_popcountll(k - 1);
cout << x + add << '\n';
return 0;
}
- Java
import java.io.BufferedInputStream;
import java.io.IOException;
public class Main {
static class FastScanner {
private final BufferedInputStream in = new BufferedInputStream(System.in);
private final byte[] buf = new byte[1 << 16];
private int len = 0;
private int ptr = 0;
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buf);
ptr = 0;
if (len <= 0) {
return -1;
}
}
return buf[ptr++];
}
long nextLong() throws IOException {
int c;
do {
c = read();
} while (c <= ' ' && c != -1);
long sgn = 1;
if (c == '-') {
sgn = -1;
c = read();
}
long val = 0;
while (c > ' ') {
val = val * 10 + c - '0';
c = read();
}
return val * sgn;
}
}
public static void main(String[] args) throws Exception {
FastScanner fs = new FastScanner();
long x = fs.nextLong();
int n = (int) fs.nextLong();
long k = fs.nextLong();
// Long.bitCount 用来统计 k-1 的二进制中 1 的个数。
long add = n - Long.bitCount(k - 1);
System.out.println(x + add);
}
}
2. 传送后的最短会合步数
问题描述
本题是京东 2026.03.21 第 2 题的原题。
小兰在设计一套传送实验。地图上的每个城市都用一个正整数编号表示,当前两名测试员分别站在编号为 和
的城市。
对任意一名测试员,都允许执行下面三种单次传送:
每一步只能选择其中一人操作一次。
请计算,至少需要多少步,才能让两人最终站到同一个城市。
输入
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
查看7道真题和解析