[秋招笔试]-百度2023秋招研发A卷
百度2023秋招研发A卷
用的是牛客的系统,不知道是我这边电脑和网络的问题,还是牛客系统的问题,我刚开始做选择题的时候,一会卡的点不动选项,一会是摄像头异常(只能退出重进),笔试过程中还接了登临HR的电话,约了一个面试的时间,反正我选择题的时候,问题百出,我退出系统重进都有三次了,也浪费了一些时间,应该会被记录下来吧【不过,我坦然了,据今年入职的应届生说,百度那边试用期六个月,转正名额都不多,今年秋招hc可想而知】。选择题的范围很广,SQL也有,计组也有,反正范围比较广,我记得还有两道是关于Spark,emmm....我是做编译器的,接触都是C和linux的东东,我都不知道这是个啥东西。题型的话,是15道单选,5道多选,3个编程题。
第一题 百度型字符串
小红拿到了一个字符串,她想知道有多少个"baidu"型子串?所谓"baidu"型字符串,指第1个、第4个字母是辅音,第2、3、5个字来是元音,且每个字母都不相同的字符串。例如,"taigu"、"huida"、"paobu"、"baoli"等都是"baidu"型字符串。
我们定义,元音字母仅有'a'、 'e'、'i'、 'o'、'u'这五种,其余字母均为辅字母。
输入描述:
一个仅由小写字母组成的字符串,长度不超过200000。
输出描述:
"baidu"型子串的数量。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
baiduoxiaojiabankanjiaran
输出
2
说明
共有"baidu"和"duoxi"这两个baidu型字符串。请注意,"jiaba"和"jiara"并不是baidu型字符串,因为都出现了两个'a '。
我的题解
#include <bits/stdc++.h> using namespace std; int main() { // freopen("in.txt", "r", stdin); string str; cin >> str; unsigned int cnt = 0; int st = 0; int i = 0; while (st + i < str.size()) { // 先判断有没有重复的字符 if (st + 5 < str.size()) { if (count(str.begin() + st, str.begin() + st + 5, str[st + i]) != 1) { // cout << "有重复性字符" << endl; st++; i = 0; continue; } } else { if (count(str.begin() + st, str.end(), str[st + i]) != 1) { // cout << "有重复性字符" << endl; st++; i = 0; continue; } } // 说明该字符不重复 if (i == 1 || i == 2) { if (!(str[st + i] == 'a' || str[st + i] == 'e' || str[st + i] == 'i' || str[st + i] == 'o' || str[st + i] == 'u')) { st++; i = 0; continue; } } else if (i == 0 || i == 3) { if (str[st + i] == 'a' || str[st + i] == 'e' || str[st + i] == 'i' || str[st + i] == 'o' || str[st + i] == 'u') { st++; i = 0; continue; } } // 如果是第5个字符了 if (i == 4) { if (str[st + i] == 'a' || str[st + i] == 'e' || str[st + i] == 'i' || str[st + i] == 'o' || str[st + i] == 'u') { cnt++; st++; i = 0; } else { st++; i = 0; } } else { i++; } } cout << cnt << endl; return 0; }
我是根据字面意思判断的,st代表当前字符串的起始位置,i指示当前字符串的位置,范围是0到4。全部AC了,但是因为刚开始没仔细看题目,中间改动了挺多,浪费了一些时间。
第二题 反转01串
小红拿到了一个01串,她每次可以选择一个长度为2的连续子串取反(0变1,1变0),她想知道,是否能在有限的操作次数内使得所有字符相同?
共有q组询问。
输入描述:
第一行输入一个正整数q,代表询问次数。
每次询问输入一个字符串,仅由'0'和'1'组成。所有字符串长度之和不超过200000。
输出描述:
对于每次询问,如果该字符串可以通过有限的操作使得所有字符相同,则输出"Yes",否则输出"No"。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 101 1111 1011
输出
Yes Yes No
说明
第一组询问,先对前两个字符操作,交成"011",然后对后两个字符操作,变成"000"。
第二组询问,不需要任何操作。
第三组询问,显然无法通过有效的操作次效使得所有字符相等。
我的题解
#include<bits/stdc++.h> using namespace std; int main(){ // freopen("in.txt", "r", stdin); int t; string str; cin >> t; while(t--){ cin >> str; int zero=count(str.begin(), str.end(), '0'); int one=count(str.begin(), str.end(), '1'); if( zero %2==0 || one %2 ==0) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
看到题目第一眼就感觉和牛客上之前做的百度的笔试题有点类似,比如:最小值_百度笔试题_牛客网 (nowcoder.com)和最小公倍数与最大公约数_百度笔试题_牛客网 (nowcoder.com),更多的是考察数学和逻辑而不是编程。所以当时立马就觉得和字符串中0和1的个数有关,仔细思考,可以有以下结论:取反操作可以实现对任意偶数个0或1取反( 因为通过若干次操作,可以达到【同时翻转任意两个位置的字符】的效果。具体做法:要想交换第 i 和 j 位(i < j)的字符,只需要依次将 i 和 i+1、i+1和i+2、...、j-1和j交换即可。途中只有 i 和 j 两个数字反转了一次,其余数字反转了2次所以没有变化)。因此,只要字符串中 0或1的数量为偶数即可。
做的时候时间就剩几分钟,我直接在网页上写的,结果我错把count写成了find........,刚写完,还没调试就自动提交了,然后我发现count写错了,emmmm,别提多难受了
第三题 字符矩阵最小移动步数
小红拿到了一个字符矩阵,矩阵仅由'r、'e'、'd'三种字符组成。她初始站在左上角,每次可以走到一个相邻的字符上(每个字符上、下、左、右最多4个相邻)。但有个限制,小红不能从'r走到d',从'e'走到r' ,从'd'走到e',其他情况都能走。
小红想知道,从左上角走到右下角至少需要多少步?
输入描述:
第一行输入两个正整数n和m,代表矩阵的行数和列数。
接下来的n行,每行输入一个长度为m的字符串,用来表示矩阵。
1≤n, m ≤500
输出描述:
如果小红无法到达右下角,则输出-1。
否则输出一个整数,代表小红的最少移动步数。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 3 red der rdr
输出
4
说明
小红可以走r →e →e → d →r,共需要移动4步。
我的题解:
额,没做到这一题,就只是单纯截图记录了一下题目。后续有时间补充一下,最近面试多,顾不上.....
其他大佬的题解:
https://www.nowcoder.com/discuss/1049972
https://www.nowcoder.com/discuss/1049863
其他牛友的题目截图链接:
https://www.nowcoder.com/feed/main/detail/b9e81a556d4d49ac976aaefbbff84c50
#百度笔试##百度秋招##百度23秋招笔试编程题有点儿简单啊#