百度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

输入输出示例仅供调试,后台判题数据一般不包含示例

输入
1
baiduoxiaojiabankanjiaran
输出
1
2
说明

共有”baidu”和”duoxi”这两个baidu型字符串。请注意,”jiaba”和”jiara”并不是baidu型字符串,因为都出现了两个’a ‘。

我的题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#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

输入输出示例仅供调试,后台判题数据一般不包含示例

输入
1
2
3
4
3
101
1111
1011
输出
1
2
3
Yes
Yes
No
说明

第一组询问,先对前两个字符操作,交成”011”,然后对后两个字符操作,变成”000”。
第二组询问,不需要任何操作。
第三组询问,显然无法通过有效的操作次效使得所有字符相等。

我的题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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

输入输出示例仅供调试,后台判题数据一般不包含示例

输入
1
2
3
4
3 3
red
der
rdr
输出
1
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

img

img

img

打赏
  • 版权声明: 版权所有属于未央。商业转载,请联系作者(邮箱:sheensong@163.com)以获取授权。 非商业转载,请注明出处并附上原文链接,谢谢配合。

请我喝杯咖啡吧~

支付宝
微信