【秋招笔试】2025.09.06京东秋招笔试真题改编

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线160+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

京东

题目一:小毛的密码破译

1️⃣:使用位掩码记录每种字符出现次数的奇偶性

2️⃣:贪心策略维护当前片段,当掩码中1的个数超过1时进行分割

3️⃣:时间复杂度 O(n),空间复杂度 O(1)

难度:中等

这道题的核心在于理解"平衡"片段的数学本质:一个片段是平衡的当且仅当其中最多只有一种字符出现奇数次。通过位掩码技巧可以高效地判断和维护这个条件,结合贪心策略得到最优解。

题目二:小兰的花园观赏计划

1️⃣:使用扫描线算法统计不同时间段的花朵绽放情况

2️⃣:计算每种花独自绽放和双花绽放的时间长度

3️⃣:通过调整收益公式找到最优的花朵调整方案

难度:中等偏难

这道题结合了区间处理和优化问题。关键是理解调整一种花的位置会如何影响"恰好一种花绽放"的时间长度,通过扫描线算法高效计算各种情况下的时间贡献,最终找到最优调整策略。

01. 小毛的密码破译

问题描述

小毛是一名密码学专家,最近他收到了一份来自古代的加密信息。这份信息由一串小写字母组成,每个字母代表一种特殊的符号。

根据古籍记载,要成功破译这段加密信息,需要将其分割成若干个片段。对于每个片段,相同的符号可以两两配对消除。如果一个片段经过配对消除后,要么所有符号都被消除,要么只剩下一个符号,那么这个片段就被认为是"平衡的"。

小毛想知道,最少需要将这段加密信息分割成多少个片段,才能使得每个片段都是平衡的。

输入格式

输入一行,包含一个由小写字母组成的字符串 ,表示加密信息。字符串长度不超过

输出格式

输出一个整数,表示最少需要分割成的片段数。

样例输入

xyz
abcdabcd
rrzbbaau

样例输出

3
1
2
样例编号 解释说明
样例1 每个字符都只出现一次,无法配对消除,需要分割成3个片段:x, y, z
样例2 每种字符都出现偶数次,可以完全配对消除,只需1个片段
样例3 可以分割为 "rrz", "bbaau" 两个片段,其中第一个片段r出现2次可消除剩z,第二个片段bb和aa可消除剩u

数据范围

  • 只包含小写字母

题解

这道题的关键在于理解什么样的片段是"平衡的"。

对于一个片段,如果相同字符两两消除后最多剩下1个字符,那么这个片段中所有字符的出现次数最多只能有1个是奇数。

我们可以用一个26位的二进制数(掩码)来表示当前片段中每种字符出现次数的奇偶性。如果某个字符出现奇数次,对应位为1;出现偶数次,对应位为0。

一个片段是平衡的,当且仅当其掩码中1的个数不超过1个。

算法采用贪心策略:从左到右扫描字符串,维护当前片段的掩码。每当加入一个新字符后,掩码中1的个数超过1时,就必须在这个字符之前进行分割,然后从当前字符开始新的片段。

这个贪心策略是正确的,因为如果存在更优解(延后分割),那么前面的片段必然包含更多字符,但此时掩码中1的个数已经超过1,不满足平衡条件。

时间复杂度为 ,空间复杂度为

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()

def solve():
    s = input()
    ans = 1  # 至少需要一段
    mask = 0  # 当前段的奇偶掩码
    
    for ch in s:
        # 计算加入当前字符后的新掩码
        bit_pos = ord(ch) - ord('a')
        new_mask = mask ^ (1 << bit_pos)
        
        # 检查1的个数是否超过1
        if bin(new_mask).count('1') <= 1:
            mask = new_mask  # 继续当前段
        else:
            ans += 1  # 必须分割
            mask = 1 << bit_pos  # 新段从当前字符开始
    
    print(ans)

solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string s;
    cin >> s;
    
    int cnt = 1;  // 至少一段
    int mask = 0;  // 当前段的奇偶位掩码
    
    for (char c : s) {
        int bit = 1 << (c - 'a');
        int new_mask = mask ^ bit;
        
        // 检查popcount是否不超过1
        if (__builtin_popcount(new_mask) <= 1) {
            mask = new_mask;  // 继续当前段
        } else {
            cnt++;  // 必须切割
            mask = bit;  // 新段开始
        }
    }
    
    cout << cnt << "\n";
    return 0;
}
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        
        int segCnt = 1;  // 至少一段
        int bitMask = 0;  // 当前段的奇偶掩码
        
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            int bitPos = ch - 'a';
            int newMask = bitMask ^ (1 << bitPos);
            
            // 检查二进制1的个数
            if (Integer.bitCount(newMask) <= 1) {
                bitMask = newMask;  // 继续当前段
            } else {
                segCnt++;  // 必须分割
                bitMask = 1 << bitPos;  // 新段开始
            }
        }
        
        System.out.println(segCnt);
        sc.close();
    }
}

02. 小兰的花园观赏计划

问题描述

小兰是一位园艺爱好者,她在自己的花园里种植了 种特殊的花卉。这些花卉具有一个独特的特性:每种花都会在特定的时间段内绽放,且绽放时间都是 个时间单位。

具体来说,第 种花会在时间段 内绽放。

小兰有一个特殊的癖好:她认为当花园中恰好有一种花在绽放时,景色是最美的。如果同时有多种花绽放,她觉得过于繁华而失去了优雅;如果没有花绽放,她又觉得过于单调。

作为一位园艺大师,小兰可以使用一次特殊的园艺技巧:她可以选择任意一种花,将其绽放开始时间 调整为任意正整数值。

小兰想知道,通过最多一次调整,她最多能让"恰好有一种花绽放"的时间持续多久?

输入格式

第一行包含一个正整数 ,表示测试用例的数量。

对于每个测试用例:

第一行包含两个正整数 ,分别表示花的种类数和每种花的绽放时长。

第二行包含 个正整数 ,表示每种花的初始绽放开始时间。

输出格式

对于每个测试用例,输出一行一个非负整数,表示恰好有一种花绽放的最大时间长度。

样例输入

2
4 10
1 3 12 20
5 5
2 1 10 3 11

样例输出

36
12
样例编号 解释说明
样例1 初始时恰好一种花绽放的时间段有:[1,2], [11,11], [13,19], [22,29],总长度18。将第2种花调整到时间30开始绽放后,恰好一种花绽放的时间段变为:[1,10], [12,19], [22,29], [30,39],总长度36
样例2 通过合理调整一种花的绽放时间,可以使恰好一种花绽放的最大时间长度达到12

数据范围

  • 调整时 可以设置为任意正整数

题解

这道题需要我们理解一个关键点:通过调整一种花的绽放时间,我们希望最大化"恰好有一种花绽放"的时间长度。

首先分析不调整时的情况。我们可以使用扫描线算法来计算:

  1. 恰好有一种花绽放的总时间长度
  2. 对于每种花 ,计算它独自绽放的时间长度(记为
  3. 对于每种花 ,计算它与恰好一种其他花同时绽放的时间长度(记为

当我们将第 种花调整到一个与其他所有花都不重叠的位置时:

  • 增加 个时间单位(这种花将独自绽放 个时间单位)
  • 失去 个时间单位(原来这种花独自绽放的时间被移走)
  • 增加 个时间单位(原来有两种花同时绽放的时间段,现在只有一种花绽放)

因此,调整第 种花的收益为:

最终答案是:,其中 是初始状态下恰好一种花绽放的

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

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

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

全部评论
好像第一题用贪心不能保证最优解啊 例如 abac这一个要切分的话 贪心会切成4个 但是实际上只需要分成2个
点赞 回复 分享
发布于 2025-09-19 11:13 广东

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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