阿里巴巴3.25C++研发笔试编程题解
Posted hesorchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里巴巴3.25C++研发笔试编程题解相关的知识,希望对你有一定的参考价值。
第一题、判断密码合法性
长度要在6-12之间,要全为字母,之前不能已经存在
有个小坑,有空格。
AC代码
#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
bool check(char x)
if (x >= 'a' && x <= 'z')
return 1;
if (x >= 'A' && x <= 'Z')
return 1;
return 0;
void solve()
string a;
getline(cin, a);
int len = a.size();
if (len < 6 || len > 12) //长度不合法
puts("illegal length");
return;
for (auto it : a) //全部英文
if (!check(it))
puts("illegal charactor");
return;
if (mp.count(a))
puts("acount existed");
return;
mp[a] = 1;
puts("registration complete");
int main()
int t;
cin >> t;
getchar();
while (t--)
solve();
return 0;
第二题
给出五个数,每次可以选择四个数减一,不能减成负数,问最多减多少次。
加个小优化即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
long long a[10];
void solve()
long long ans = 0;
for (long long i = 1; i <= 5; i++)
cin >> a[i];
while (1)
sort(a + 1, a + 1 + 5, greater<long long>());
if (a[4] == 0)
break;
long long delta = min(a[4], a[4] - a[5] + 1);
if (abs(a[4] - a[5]) == 1 && a[4] >= 100)
delta = a[4] / 10;
ans += delta;
for (long long i = 1; i <= 4; i++)
a[i] -= delta;
cout << ans << endl;
int main()
long long t;
cin >> t;
while (t--)
solve();
return 0;
第三题
有n条直线,可以将他们分成黑白两组,问最多黑白直线的交点有多少个?
容易想到相同斜率的会分成一组,因此将每种斜率的数量求出来,对其进行01背包尽可能的均匀分组,两组数量相乘就是答案。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
struct node
int x, y, c;
int col;
double k;
line[N];
int dp[N][N / 2];
void solve()
map<double, int> mp; //斜率为k的有i条
map<int, int> mp2; //有i条斜率为k
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> line[i].x >> line[i].y >> line[i].c;
line[i].k = 1.0 * line[i].x / line[i].y;
mp[line[i].k]++;
vector<int> vec;
vec.emplace_back(-1);
for (auto it : mp)
vec.emplace_back(it.second);
int m = vec.size();
dp[0][0] = 1;
int mx = 0;
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n / 2; j++)
dp[i + 1][j] = dp[i][j];
for (int j = 0; j <= n / 2; j++)
if (j + vec[i] <= n / 2)
dp[i + 1][j + vec[i]] = max(dp[i][j], dp[i + 1][j + vec[i]]);
if (dp[i + 1][j + vec[i]])
mx = max(mx, j + vec[i]);
cout << (n - mx) * mx << endl;
int main()
ios::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
总结:前面八股有些不会,编程题运气还可以,优化优化就过了,不过太久没刷题了,01背包写了个二维的。。
以上是关于阿里巴巴3.25C++研发笔试编程题解的主要内容,如果未能解决你的问题,请参考以下文章