阿里巴巴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背包写了个二维的。。

猜你喜欢

转载自blog.csdn.net/hesorchen/article/details/123729361
今日推荐