【笔试刷题】京东-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.212 题的原题。

小兰在设计一套传送实验。地图上的每个城市都用一个正整数编号表示,当前两名测试员分别站在编号为 的城市。

对任意一名测试员,都允许执行下面三种单次传送:

每一步只能选择其中一人操作一次。
请计算,至少需要多少步,才能让两人最终站到同一个城市。

输入

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务