阿里巴巴0322开发岗笔试总结

写在前面:

本周的阿里笔试感觉比上周的要简单,可惜阿里每人只给一次笔试机会,这次算是场外写题当练习了。

本篇文章仅分享本人解答代码做学习交流,若涉密或侵权可联系我删除。

题目 1

题目描述

给你一个字符串,里面仅包含'A', 'a', 'L', 'l', 'I', 'i'四种字母,询问你是否整体上是ALI这样的排列,不区分大小写。

例如 AaAaallLLlLiIiIiI 这样就是满足要求的,而 AL 这种就输出 No。

解题方法

直接进行模拟即可。

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
#include<bits/stdc++.h>

using namespace std;

int main() {
int t;
cin>>t;
while (t--) {
string s;
cin>>s;
int i = 0, len = s.length();
bool one = false, two = false, three = false;
while (i < len && tolower(s[i++]) == 'a') {
one = true;
break;
}
while (i < len && tolower(s[i++]) == 'l') {
two = true;
break;
}
while (i < len && tolower(s[i++]) == 'i') {
three = true;
break;
}
if (one && two && three && i == len) {
cout<<"Yes"<<endl;
}
else {
cout<<"No"<<endl;
}
}
}

题目 2

题目描述

给你一个仅包含 01 的字符串,每次可以反转相邻的两位,将 0 反转成 1 ,1 反转成 0 ,问最大化 1 的个数的最小次数。

例如 0101 可以通过以下步骤完成:

0101 - > 0011 - > 1111

解题方法

思维题。通过尝试可以发现两个 0 是可以通过反转他们下标差的次数来变成 1 的,如题目描述中那样。因此就可以统计出所有 0 出现的下标,将其从左到右或者从右到左相互匹配转换成 1 ,当然对于奇数个 0 最终还是会有一个无法完成转换。

代码如下:

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
#include<bits/stdc++.h>

using namespace std;

int main() {
string s;
cin>>s;
int len = s.length();
vector<int> pos;
for (int i = 0; i < len; i++) {
if (s[i] == '0') {
pos.emplace_back(i);
}
}
int l_ans = 0, r_ans = 0;
// 从左到右匹配
for (int i = 1; i < pos.size(); i += 2) {
l_ans += pos[i] - pos[i - 1];
}
// 从右到左匹配
for (int i = pos.size() - 2; i >= 0; i -= 2) {
r_ans += pos[i + 1] - pos[i];
}
cout<<min(l_ans, r_ans)<<endl;
}

题目 3

题目描述

//todo

解题方法

//todo


阿里巴巴0322开发岗笔试总结
http://shijieq.github.io/2023/03/22/Algorithm/InternJob/Alibaba0322Dev/
Author
ShijieQ
Posted on
March 22, 2023
Licensed under