百度笔试 百度笔试题 1015

笔试时间:2024年10月15 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

整数1~n,计算选择k个数最多能获得多少积分。计分规则:初始积分为 0,对于被选取的整数,如果i+1没选,则积分加1。

输入描述

每个测试文件均包含多组测试数据。

第一行输入一个整数T(1 ≤T ≤ 10^5)代表数据组数,每组测试数据描述如下:

在一行上输入两个整数 n,k(1 ≤ n,k ≤ 10^12;k≤ n),含义和题面描述一致。

输出描述

对于每一组测试数据,在一行上输出一个整数,代表最多能获得的积分。

样例输入

2

1 1

4 2

样例输出

1

2

参考题解

为了最大化积分,我们需要尽可能多地选择那些满足 i+1 没有被选取的整数。换句话说,我们希望尽可能多地选择那些不与下一个数连续的数。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <algorithm>
#include <sstream>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int T;
    cin >> T; // 读取测试用例数量
    
    while (T--) {
        long long n, k;
        cin >> n >> k; // 读取n和k
        
        // 计算最大积分
        long long max_points = min(k, n - k + 1);
        
        // 输出结果
        cout << max_points << "\n";
    }
    
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // 使用BufferedReader读取输入,提高I/O效率
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 使用BufferedWriter输出结果,提高I/O效率
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        
        // 读取测试用例数量T
        int T = Integer.parseInt(br.readLine());
        
        while (T-- > 0) {
            // 读取每组测试数据的n和k
            st = new StringTokenizer(br.readLine());
            long n = Long.parseLong(st.nextToken());
            long k = Long.parseLong(st.nextToken());
            
            // 计算最大积分
            long max_points = Math.min(k, n - k + 1);
            
            // 将结果写入输出缓冲区
            bw.write(String.valueOf(max_points));
            bw.newLine();
        }
        
        // 刷新并关闭输出缓冲区
        bw.flush();
        bw.close();
        br.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

import sys

# 使用sys.stdin和sys.stdout提高I/O效率
input = sys.stdin.read
output = sys.stdout.write

def main():
    data = input().splitlines()
    T = int(data[0])  # 读取测试用例数量
    result = []
    
    for i in range(1, T + 1):
        n, k = map(int, data[i].split())  # 读取n和k
        # 计算最大积分
        max_points = min(k, n - k + 1)
        result.append(str(max_points))
    
    # 输出结果
    output("\n".join(result) + "\n")

if __name__ == "__main__":
    main()

第二题

题目

长度为 n 只包含小写字母的字符串 S,下标1开始。进行n次操作,第i次操作将 Si移动到字符串末尾。输出,n次操作后的字符串。例如字符串"abqde",第一步"bqdea",第二步"bdeaq",第三步,第四步"bdaeq""bdage",第五步"bdaeq"。

输入描述

在一行上输入一个由小写字母构成的字符串,长度记为n(1 ≤ n < 10^6)。

输出描述

在一行上输出一个字符串,表示操作后的字符串。

样例输入

abqde

样例输出

bdeaq

参考题解

初始化二叉搜索树:我们将字符串中的每个字符的位置映射到 二叉搜索树中,并初始化二叉搜索树以表示每个位置上都有一个字符。

模拟操作:对于每次操作 i,使用 BIT 查找当前字符串的第 i 个字符的位置。将该字符记录为被移动到末尾的字符。更新 BIT,将该位置标记为空,并在末尾追加该字符。构造最终字符串:将未被移动的字符按照原始顺序放在最终字符串的前部。将被移动的字符按照它们被移动的顺序放在最终字符串的后部。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>

using namespace std;

class BIT {
public:
    int size;
    vector<int> tree;

    BIT(int size) : size(size) {
        tree.assign(size + 2, 0);
    }

    // 更新BIT树,index位置加delta
    void update(int index, int delta) {
        while (index <= size) {
            tree[index] += delta;
            index += index & (-index);
        }
    }

    // 查询前缀和[1, index]
    int query(int index) {
        int res = 0;
        while (index > 0) {
            res += tree[index];
            index -= index & (-index);
        }
        return res;
    }

    // 查找第k个存在的字符的位置
    int findKth(int k) {
        int idx = 0;
        int bitMask = 1 << (31 - __builtin_clz(size));
        while (bitMask != 0) {
            if (idx + bitMask <= size && tree[idx + bitMask] < k) {
                idx += bitMask;
                k -= tree[idx];
            }
            bitMask >>= 1;
        }
        return idx + 1;
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string S;
    cin >> S;
    int n = S.length();

    vector<int> lastMoveTime(n, 0);
    vector<int> chars(2 * n + 2, 0);
    for (int pos = 1; pos <= n; pos++) {
        chars[pos] = pos - 1;
    }

    BIT bit(2 * n + 1);
    for (int pos = 1; pos <= n; pos++) {
        bit.update(pos, 1);
    }

    int end = n;

    for (int i = 1; i <= n; i++) {
        if (i > bit.query(bit.size)) {
            continue;
        }

        int pos = bit.findKth(i);
        int c = chars[pos];
        lastMoveTime[c] = i;

        bit.update(pos, -1);
        end++;
        chars[end] = c;
        bit.update(end, 1);
    }

    vector<char> finalMovedChars(n + 1, 0);
    for (int c = 0; c < n; c++) {
        if (lastMoveTime[c] > 0) {
            finalMovedChars[lastMoveTime[c]] = S[c];
        }
    }

    stringstream sb;

    for (int c = 0; c < n; c++) {
        if (lastMoveTime[c] == 0) {
            sb << S[c];
        }
    }

    for (int i = 1; i <= n; i++) {
        if (finalMovedChars[i] != 0) {
            sb << finalMovedChars[i];
        }
    }

    cout << sb.str() << "\n";
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.io.*;
import java.util.*;

public class Main {
    // 二叉索引树(Fenwick Tree)实现
    static class BIT {
        int size;
        int[] tree;

        BIT(int size) {
            this.size = size;
            tree = new int[size + 2];
        }

        // 更新BIT树,index位置加delta
        void update(int index, int delt

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
第二题我直接两个库函数结果时间复杂度超了
点赞 回复 分享
发布于 10-15 23:46 新加坡

相关推荐

点赞 5 评论
分享
牛客网
牛客企业服务