京东笔试 京东秋招 0906

笔试时间:2025年9月6日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目描述: 小明是一个魔法项链回收商,他的工作是将这些魔法项链进行无害化处理。魔法项链由若干颗魔法石组成,可以视作一个字符串,不同种类的魔法石可以用小写字母 a~z 来进行表示。小明可以将魔法项链切割为若干段(也可以不切割),每一段中相同种类的魔法石可以进行能量抵消,如果最终宝石全部抵消或者只剩一颗,那么就算完成了无害化处理。

输入描述

一个字符串,只包含小写字母,用来表示小明回收的魔法项链,长度不超过 100000

输出描述

一个整数,表示最小需要切割为多少段,可以使所有项链子段都能完成无害化处理。

样例输入

xyz

样例输出

3

参考题解

将一段可"无害化"的充要条件转成字符奇偶性的判断:一段内每个字母出现次数全为偶数,或仅有一个字母为奇数。使用26位比特的前缀奇偶掩码,通过动态规划和哈希表优化找出最少分割段数。

C++:

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string s;
    cin >> s;
    
    const int INF = 1e9;
    unordered_map<int,int> best_by_mask;
    best_by_mask.reserve(s.size() * 2 + 32);
    best_by_mask[0] = 0;
    
    int mask = 0, segments = 0;
    
    for (char ch : s) {
        mask ^= 1 << (ch - 'a');
        int min_prev = INF;
        
        auto it = best_by_mask.find(mask);
        if (it != best_by_mask.end()) min_prev = it->second;
        
        for (int k = 0; k < 26; ++k) {
            int neigh = mask ^ (1 << k);
            auto jt = best_by_mask.find(neigh);
            if (jt != best_by_mask.end()) min_prev = min(min_prev, jt->second);
        }
        
        segments = min_prev + 1;
        if (it == best_by_mask.end() || segments < it->second) 
            best_by_mask[mask] = segments;
    }
    
    cout << segments << '\n';
    return 0;
}

Java:

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        
        final int INF = 1000000000;
        Map<Integer, Integer> bestByMask = new HashMap<>();
        bestByMask.put(0, 0);
        
        int mask = 0, segments = 0;
        
        for (char ch : s.toCharArray()) {
            mask ^= 1 << (ch - 'a');
            int minPrev = INF;
            
            Integer val = bestByMask.get(mask);
            if (val != null) minPrev = val;
            
            for (int k = 0; k < 26; k++) {
                int neigh = mask ^ (1 << k);
                Integer neighVal = bestByMask.get(neigh);
                if (neighVal != null) minPrev = Math.min(minPrev, neighVal);
            }
            
            segments = minPrev + 1;
            if (val == null || segments < val) {
                bestByMask.put(mask, segments);
            }
        }
        
        System.out.println(segments);
    }
}

Python:

def solve():
    s = input().strip()
    
    INF = 10**9
    best_by_mask = {0: 0}
    
    mask = 0
    segments = 0
    
    for ch in s:
        mask ^= 1 << (ord(ch) - ord('a'))
        min_prev = INF
        
        if mask in best_by_mask:
            min_prev = best_by_mask[mask]
        
        for k in range(26):
            neigh = mask ^ (1 << k)
            if neigh in best_by_mask:
                min_prev = min(min_prev, best_by_mask[neigh])
        
        segments = min_prev + 1
        if mask not in best_by_mask or segments < best_by_mask[mask]:
            best_by_mask[mask] = segments
    
    print(segments)

solve()

第二题

题目描述: 小明种植了n株昙花,每一株昙花只会开花m秒。第i株昙花将会在[ti, ti+m-1]开花。小明想让恰有一株昙花开花的时刻尽可能多。作为大魔法师,小明可以施展至多一次魔法:选定任意一株昙花,并将这株昙花的开花时间ti修改成任意正整数。

输入描述

第一行一个正整数T,表示数据组数

对于每一组数据:

第一行两个正整数n和m

第二行n个正整数,表示t1,t2,...,tn

1≤n≤2×10^5,1≤m,ti≤5n,1≤T≤1000

输出描述

输出T行,每

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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