【春招笔试】2025.03.13-百度春招笔试题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺
  • 配套练习题库

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

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

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

百度 2025.03.13题目集

题目一:图书馆整理计划

1️⃣:统计每本书的编号出现次数,找出出现次数在 范围内的编号

2️⃣:将这些编号的所有书从书架上移除,保持剩余书籍的相对顺序不变

3️⃣:时间复杂度 ,空间复杂度 ,需要使用哈希表存储频次和待移除编号集合

难度:简单

题目二:魔法能量优化

1️⃣:将问题转化为:选择任意偶数个水晶施加魔法波动,使得总能量最大

2️⃣:计算每个水晶施加魔法波动后的能量增量 ,并按从大到小排序

3️⃣:贪心地选择增量为正的水晶对进行操作,时间复杂度

难度:中等

01. 图书馆整理计划

问题描述

小兰是一位图书馆管理员,她正在整理一排共 本书。每本书都有一个唯一的编号 。为了让书架看起来更整洁,小兰决定按照以下规则移除一些书:

如果某个编号的书在书架上出现的次数在 之间(包括 ),那么所有这个编号的书都会被移除,而其他书的相对位置保持不变。

小兰想知道应用这个规则后,书架上还剩下哪些书。

输入格式

输入包含多组测试数据。

第一行包含一个正整数 ,表示测试数据的组数。

接下来每两行描述一组测试数据:

  • 第一行包含三个整数 ,分别表示书的总数、移除规则的下限和上限。
  • 第二行包含 个整数,第 个整数是 ,表示每本书的编号。

保证对于单个测试点所有测试数据的 之和不超过

输出格式

对于每组测试数据,输出两行:

  • 第一行包含一个整数 ,表示整理后书架上剩余的书的数量。
  • 第二行包含 个整数,描述整理后书架上的书的编号。

数据保证 不为

样例输入

2  
6 2 2  
3 2 1 1 1 2  
6 1 2  
3 2 1 1 1 2  

样例输出

4  
3 1 1 1  
3  
1 1 1  
样例 解释说明
样例1 对于第一组测试数据,编号为 的书出现了2次,在移除范围 内,所以所有编号为 的书被移除。
对于第二组测试数据,编号为 的书出现了2次,编号为 的书出现了1次,都在移除范围 内,所以它们都被移除。

数据范围

  • 所有测试数据的 之和不超过

题解

这道题目要求我们根据书籍编号在书架上出现的次数来决定是否移除该编号的所有书籍。

解题思路很直观:

  1. 首先统计每个编号在书架上出现的次数
  2. 确定哪些编号的书籍需要被移除(即出现次数在 范围内的编号)
  3. 遍历原书架,保留不需要移除的书籍,按原顺序输出

例如,对于样例1的第一组数据:书架上有编号为3、2、1、1、1、2的书籍。编号3出现1次,编号2出现2次,编号1出现3次。根据规则 ,只有出现次数恰好为2的编号需要被移除,即编号2。移除后,书架上剩下编号为3、1、1、1的书籍。

实现上,我们可以使用哈希表(如map或dictionary)来统计每个编号的出现次数,然后使用集合(如set)来存储需要移除的编号。最后,遍历原书架,只保留不在移除集合中的书籍。

时间复杂度:,其中 是书籍的总数。我们需要遍历书架两次,一次用于统计每个编号的出现次数,一次用于构建结果。 空间复杂度:,需要存储每个编号的出现次数和结果数组。

参考代码

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

def process_books():
    # 读取测试用例数量
    t = int(input())
    
    for _ in range(t):
        # 读取书的总数和移除规则
        n, l, r = map(int, input().split())
        books = list(map(int, input().split()))
        
        # 统计每个编号出现的次数
        freq = {}
        for book in books:
            if book in freq:
                freq[book] += 1
            else:
                freq[book] = 1
        
        # 确定需要移除的编号
        remove = set()
        for book, count in freq.items():
            # 检查是否在移除范围内
            if l <= count <= r:
                remove.add(book)
        
        # 构建结果数组
        result = []
        for book in books:
            if book not in remove:
                result.append(book)
        
        # 输出结果
        print(len(result))
        if result:
            print(" ".join(map(str, result)))
        else:
            print()

if __name__ == "__main__":
    process_books()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

void solve_case() {
    int n, l, r;
    cin >> n >> l >> r;
    
    vector<int> books(n);
    unordered_map<int, int> freq;
    
    // 读取书籍编号并统计频率
    for (int i = 0; i < n; i++) {
        cin >> books[i];
        freq[books[i]]++;
    }
    
    // 确定要移除的编号
    unordered_set<int> to_rm;
    for (auto &p : freq) {
        if (p.second >= l && p.second <= r) {
            to_rm.insert(p.first);
        }
    }
    
    // 构建结果
    vector<int> kept;
    for (int book : books) {
        if (to_rm.find(book) == to_rm.end()) {
            kept.push_back(book);
        }
    }
    
    // 输出结果
    cout << kept.size() << endl;
    for (int i = 0; i < kept.size(); i++) {
        cout << kept[i];
        if (i < kept.size() - 1) cout << " ";
    }
    cout << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while (t--) {
        solve_case();
    }
    
    return 0;
}
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        
        for (int tc = 0; tc < t; tc++) {
            // 读取输入
            int n = sc.nextInt();
            int l = sc.nextInt();
            int r = sc.nextInt();
            
            int[] books = new int[n];
            Map<Integer, Integer> freq = new HashMap<>();
           

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

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

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

全部评论

相关推荐

评论
3
1
分享

创作者周榜

更多
牛客网
牛客企业服务