百度0912B卷秋招笔试真题解析
- 2026-11-07 09:31:28
关注我们,每周更新两到三次大厂最新笔试题解析
前言:
题目还是比较基础的,但是第一题找规律有好多同学翻车了....
(ak代码由睿宝投稿)
第一题
小红和朋友玩游戏,棋盘为nxm的坐标轴有一颗棋子在坐标(1,1)的位置,每次可以向上或者向右移动奇数单位,不能移动到棋盘外面,无法行动就输了,小红先手,请问小红能否必胜。
输入描述
一行一个整数t,表示有t组数据。
接下来t行,每行两个整数n和m,表示棋盘大小。
1<=t<=10^4
1<=n,m <10^3
输出描述
对于每组数据,输出一行,如果小红必胜,输出”Yes”,否则输出”No”
示例1
输入
4
11
14
41
44
输出
No
Yes
Yes
No
说明
样例一,棋盘大小为1x1,小红无法行动,输了。
样例二,棋盘大小为1x4,小红第一次向右移动3个单位,小红获胜,朋友无法行动。
样例三棋盘大小为4x1,小红第一次向上移动3个单位,小红获胜,朋友无法行动。
思路与代码
m+n为奇数为Yes,否则为No;
(1) 当m+n为奇数时,可以选择直接跳到偶数那一边的最后一格子,然后剩奇数格的那条边,这个时候无论后手走几步都无法到达死角;
(2)当m+n为偶数时,无论走几格,都会陷入对方先手的第一种情况,必输。
public static void main(String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (int i = 0; i < t; i++) {
int n = sc.nextInt();
int m = sc.nextInt();
if ((m + n) % 2 == 1) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
第二题
小红有一个长度为n的排列,她可以选择两个位置,然后交换两个位置的数。
她想知道能否通过最多一次交换,使得存在一个连续子段,是长度为k的排列。
排列是指一个长度为 len的整数数组,数组中包含1到len的每个数,且每个数只出现一次。
输入描述
一行两个整数n,k,表示排列长度和连续子段长度。
一行n个整数a1,a2,...,an,表示排列。
1<=k<=n<=10^5
输出描述
如果能够通过最多一次交换,存在一个连续子段是排列,输出YES,并输出交换的位置:先输出一个整数x(0<=x<=1),然后输出x行,每行两个整数u,v,表示交换位置u,V。
否则输出NO。
示例1
输入
5 3
1 2 3 4 5
输出
YES
0
说明
子段[1,2,3]是长度为3的排列。
思路与代码
暴力可以直接过的,应该有优化空间。枚举长度为k的子数组,记录1到k的出现频次,同时记录不合规位置的次数和下标,如果第一次出现大于k的数或者同一个数出现第二次,记录不合规的位置和次数,当第二次出现不合规的数时直接跳出循环,枚举下一个。当没有不合规位置时,输出YES;如果有一个不合规的,找到缺失的数值,使用预处理的1-k数字的下标list,遍历找到一个不在子串范围内的对应值的下标,如果找到了输出“YES”以及两者的下标。遍历结束程序未结束就直接输出“NO”。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int [] a = new int[n + 1];
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
if (a[i] <= k) {
if (!map.containsKey(a[i])) map.put(a[i], new ArrayList<>());
map.get(a[i]).add(i);
}
}
for (int i = 1; i <= n - k + 1; i++) {
int count = 0;
int index = -1;
int [] p = new int[k + 1];
boolean flag = true;
for (int j = i; j < i + k; j++) {
if (a[j] > k) {
if (count == 1) {
flag = false;
break;
} else {
count++;
index = j;
continue;
}
}
p[a[j]]++;
if (p[a[j]] >= 2) {
if (count == 1) {
flag = false;
break;
} else {
index = j;
count++;
}
}
}
if (flag) {
if (count == 0) {
System.out.println("YES");
System.out.println("0");
return;
} else {
int u = 0;
for (int m = 1; m <= k; m++) {
if (p[m] == 0) {
u = m;
break;
}
}
int v = -1;
for (int i1 : map.get(u)) {
if (i1 < i || i1 >= i + k) {
v = i1;
break;
}
}
if (v != -1) {
System.out.println("YES");
System.out.println("1");
System.out.println(index + " " + v);
}
}
}
}
System.out.println("NO");
}
第三题
请你编写一个系统用来管理方法的重载和调用。
共有以下2种操作:
1.创建一个方法: 输入的格式为:“Type name(var1 a1,var2 a2......)”,大括号和方法里 内容被省略。
2调用一个方法 输入的格式为:"name(var1,var2......)”。
以上变量,vari代表变量类型,ai代表变量名,name代表方法名,Type代表返回类型,均为由小写字母组成的字符串。
请你在每次操作后给出系统反馈。
1.创建方法时,若创建成功,则输出一个字符串”ok."。否则输出一个字符串"method xxx is already defined."
2 调用方法时 若调用成功 则输H一个字符串"ok” 若方法名不存在,则输出"cannotfind symbol xxx."。若方法名存在但方法内部的变量类型错误,则输出"method xxx cannot be applied to given2 调用方法时 若调用成功 则输H一个字符串"ok” 若方法名不存在,则输出"cannotfind symbol xxx."。若方法名存在但方法内部的变量类型错误,则输出"method xxx cannot be applied to given types."。
输入描述
第一行输入一个正整数q,代表操作次数。
接下来的2*q行,每2行代表一次操作。
第一行为一个正整数op,代表操作类型
第二行为一个字符串,代表一次操作。
1<=q<=100
1<=op<=2
操作的字符串长度不超过100,且格式保证合法。
输出描述
输出q行字符串,代表每次操作系统的反馈。
示例1
输入
7
1
int f(int x)
1
int g(int x,String s)
2
f()
1
void f(double x,double y)
2
f(double,double)
2
solve(int,String)
1
void f(int y)
输出
ok.
ok.
method f cannot be applied to given types
ok.
Ok.
cannot find symbol solve.
method f is already defined.
思路与代码
模拟。用HashMap<String, List<List
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
Map<String, List<List<String>>> map = new HashMap<>();
int q = sc.nextInt();
for (int l = 0; l < q; l++) {
int op = sc.nextInt();
sc.nextLine();
String [] operate = sc.nextLine().split("\\(");
String method ;
if (op == 1) {
method = operate[0].split(" ")[1];
} else {
method = operate[0];
}
String [] params = operate[1].substring(0, operate[1].length() - 1).split(",");
if (op == 1) {
if (map.containsKey(method)) {
List<String> paramsList = new ArrayList<>();
for (String param : params) {
paramsList.add(param.split(" ")[0]);
}
boolean flag = false;
int size1 = paramsList.size();
for (List<String> list : map.get(method)) {
if (list.size() != size1) {
continue;
}
boolean flag2 = true;
for (int i = 0; i < size1; i++) {
if (!paramsList.get(i).equals(list.get(i))) {
flag2 = false;
break;
}
}
if (flag2) {
flag = true;
break;
}
}
if (flag) {
System.out.println("method " + method + " is already defined.");
} else {
map.get(method).add(paramsList);
System.out.println("ok.");
}
} else {
map.put(method, new ArrayList<>());
List<String> paramsList = new ArrayList<>();
for (String param : params) {
paramsList.add(param.split(" ")[0]);
}
map.get(method).add(paramsList);
System.out.println("ok.");
}
} else {
if (!map.containsKey(method)) {
System.out.println("cannot find symbol " + method + ".");
} else {
List<String> paramsList = new ArrayList<>(Arrays.asList(params));
boolean flag = false;
for (List<String> list : map.get(method)) {
if (list.size() != paramsList.size()) {
continue;
}
boolean flag2 = true;
for (int i = 0; i < list.size(); i++) {
if (!list.get(i).equals(paramsList.get(i))) {
flag2 = false;
break;
}
}
if (flag2) {
flag = true;
break;
}
}
if (flag) {
System.out.println("ok.");
} else {
System.out.println("method " + method + " cannot be applied to given types.");
}
}
}
}
}
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)