百度笔试 百度笔试题 0819
笔试时间:2025年8月19日
往年笔试合集:
第一题
众所周知,斐波那契数列为 1, 1, 2, 3, 5, …,即从第三项开始每一项都等于前两项之和。现在,Tk 对这串由神奇的数列元素构成的字符串,他想知道连续若干项数列的子项区间内有多少个奇数。
输入描述
第一行输入一个整数 T (1 ≤ T ≤ 10^4),表示查询次数。
此后每组测试数据一行,包含两个整数 l 和 r (1 ≤ l ≤ r ≤ 10^9),分别对应区间的左右端点。
输出描述
对于每组测试数据,输出一行一个整数,表示该区间内斐波那契数列第 l 项到第 r 项之间的奇数个数。
样例输入
2
1 2
6 6
样例输出
2
0
参考题解
可以发现:数列的奇偶性是 1 1 0 1 1 0.... 的循环,前 i 个数中有 (i / 3) * 2 + min(2, i % 3)个。
C++:
#include <bits/stdc++.h>
const int inf = 0x3f3f3f3f;
using i64 = long long;
void solve() {
int n;
std::cin >> n;
auto get = [&](int x) {
return x / 3 * 2 + std::min(2, x % 3);
};
for (int i = 0; i < n; ++i) {
int l, r;
std::cin >> l >> r;
std::cout << get(r) - get(l - 1) << "\n";
}
}
int main() {
std::cin.sync_with_stdio(false);
std::cin.tie(0);
solve();
return 0;
}
Java:
import java.io.*;
import java.util.*;
public class Main {
// 统计 [1..x] 中不是 3 的倍数的个数
static long get(long x) {
if (x <= 0) return 0; // 防止 l=0 时出现负模
return (x / 3) * 2 + Math.min(2, (int)(x % 3));
}
public static void main(String[] args) throws Exception {
FastScanner fs = new FastScanner(System.in);
StringBuilder out = new StringBuilder();
int n = fs.nextInt();
for (int i = 0; i < n; i++) {
long l = fs.nextLong();
long r = fs.nextLong();
out.append(get(r) - get(l - 1)).append('\n');
}
System.out.print(out.toString());
}
// 简洁快速输入
static class FastScanner {
private final InputStream in;
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
FastScanner(InputStream is) { in = is; }
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
long nextLong() throws IOException {
int c; long sgn = 1, val = 0;
do { c = read(); } while (c <= ' ' && c != -1);
if (c == '-') { sgn = -1; c = read(); }
while (c > ' ') { val = val * 10 + (c - '0'); c = read(); }
return val * sgn;
}
int nextInt() throws IOException { return (int) nextLong(); }
}
}
Python:
import sys
def get(x: int) -> int:
"""统计 [1..x] 中不是 3 的倍数的个数"""
if x <= 0:
return 0 # 防止 l=0 时 l-1 为负导致行为差异
return (x // 3) * 2 + min(2, x % 3)
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
it = iter(data)
n = next(it)
out_lines = []
for _ in range(n):
l = next(it); r = next(it)
out_lines.append(str(get(r) - get(l - 1)))
sys.stdout.write("\n".join(out_lines))
if __name__ == "__main__":
main()
第二题
Tk 有两个长度为 n 的数组 {a1, a2, …, an} 和 {b1, b2, …, bn}。
其中,Tk 定义这两个数组的匹配度为满足 ai = bi 的下标 i 的数目。为了最大化匹配度,Tk 将针对数组做如下的两个阶段的操作,分别是删除阶段和调整阶段:删除阶段(至少执行一次,可以执行多次):选择任意一个下标 i,删除 ai 和 bi,删掉后,剩余的元素按照原顺序重新拼接为长度为 n-1 的数组。调整阶段:修改 ai 的值为 bi+1,或不进行操作;修改 bi 的值为 ai+1,或不进行操作。记此时的数组长度为 m,Tk 按照 1 ≤ v ≤ m-1 的顺序对每个索引 i 依次执行以下两种操作:保证输出在最佳策略下能够得到的最大匹配度。
输入描述
输入包含多组测试数据。
第一行输入一个整数 T,表示测试数据的组数。
对于每组数据:
第一行输入一个整数 n (2 ≤ n ≤ 10^5)。
第二行输入 n 个整数 a1, a2, …, an (1 ≤ ai ≤ 10^9)。
第三行输入 n 个整数 b1, b2, …, bn (1 ≤ bi ≤ 10^9)。
输出描述
对于每组测试数据,输出一个整数,表示能够得到的最大匹配度。
样例输入
2
3
1 2 3
3 2 1
3
1 2 3
3 1 2
样例输出
2
0
参考题解
C++:
Java:
import java.io.*;
import java.util.*;
public class Main {
static class FastScanner {
private final InputStream in;
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
FastScanner(InputStream is) { this.in = is; }
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
int nextInt() throws IOException {
int c; int sgn = 1; int val = 0;
do { c = read(); } while (c <= ' ' && c != -1);
if (c == '-') { sgn = -1; c = read(); }
while (c > ' ') { val = val * 10 + (c - '0'); c = read(); }
return val * sgn;
}
}
public static void solve(FastScanner fs, StringBuilder out) throws Exception {
int n = fs.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) a[i] = fs.nextInt();
int ans = 0;
for (int i = 0; i < n; i++) {
b[i] = fs.nextInt();
if (a[i] == b[i]) ans++;
}
int[] pre = new int[n];
int[] suf = new int[n];
for (int i = 0; i < n; i++) {
int x = (a[i] == b[i]) ? 1 : 0;
int y = 0, z = 0, t = 0;
if (i + 1 < n) {
y = (a[i] == a[i + 1]) ? 1 : 0;
z = (b[i] == b[i + 1]) ? 1 : 0;
t = (b[i + 1] == a[i + 1]) ? 1 : 0;
}
pre[i] = Math.max(Math.max(x, y), Math.max(z, t));
if (i > 0) pre[i] += pre[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
int x = (a[i] == b[i]) ? 1 : 0;
int y = 0, z = 0, t = 0;
if (i + 1 < n) {
y = (a[i] == a[i + 1]) ? 1 : 0;
z = (b[i] == b[i + 1]) ? 1 : 0;
t = (b[i + 1] == a[i + 1]) ? 1 : 0;
}
suf[i] = Math.max(Math.max(x, y), Math.max(z, t));
if (i < n - 1) suf[i] += suf[i + 1];
}
if (n >= 1) {
ans = Math.max(ans, pre[n - 1]);
ans = Math.max(ans, suf[0]);
}
if (n >= 2) {
ans = Math.max(ans, Math.max(pre[n - 2], suf[1]));
}
if (n >= 3) {
for (int i = 1; i < n - 1; i++) {
int cur = (i > 1 ? pre[i - 2] : 0);
cur += suf[i + 1];
// a[i - 1], a[i] 都会被影响
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南