百度笔试 百度笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。