阿里巴巴0322开发岗笔试总结
写在前面:
本周的阿里笔试感觉比上周的要简单,可惜阿里每人只给一次笔试机会,这次算是场外写题当练习了。
本篇文章仅分享本人解答代码做学习交流,若涉密或侵权可联系我删除。
题目 1
题目描述
给你一个字符串,里面仅包含'A', 'a', 'L', 'l', 'I', 'i'四种字母,询问你是否整体上是ALI这样的排列,不区分大小写。
例如 AaAaallLLlLiIiIiI
这样就是满足要求的,而
AL
这种就输出 No。
解题方法
直接进行模拟即可。
1 |
|
题目 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