阿里巴巴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++研发笔试编程题解的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1007: [HNOI2008]水平可见直线

笔试-2020阿里巴巴研发工程师JAVA笔试考试凉经(虽然觉得自己会凉,但是还是有一些失落)

3.25

BZOJ day8

百度 | 2021校招C++研发工程师笔试详解

面经|阿里巴巴Java研发工程师