华为23年5月6日机试(前两题)

=================一些心里话=================

我现在真的很难受,华为机试必须要150分以上才能通过,但是我考试的时候只写出来第一题(83%)

第二题在考试结束10min之后才写出来

这意味着自己与华为无缘了,心里真的很难受,为什么这么笨,为什么考试的时候写不出来,为什么考试的时候不先做分高的题目。

不管怎么说,通过这次考试还是知道了自己与企业要求的差距,看来我现在还是没达到要求。

没关系,过去了就过去了,之后还要继续努力!

===================下面是正文===================

第一题题目是说:

有一个墨盒,用一维数组表示,值为0或者1。

1表示墨盒对应位置是好的,0表示对应位置是坏的。

当我们打印东西的时候,用好的地方打印没有问题,但是用坏的地方打印就会出错。

现在想出来一种补偿算法,即打印两次,第二次打印第一次没打印好的地方。

第二次打印的时候,会将墨盒向左或者向右平移x个单位长度,再重新打印。

要求第二次打印的时候,如果原来是好的地方,不重新打印,只打印错误的地方。

现在求第二次打印的时候,墨盒应该使能的位置(用一个一维数组表示,0表示不使能,1表示使能)

输出格式:

如果向左右平移都能成功,取平移单位最少的两个方案输出。

如果向左或者向右能成功,输出那个平移单位最少的方案。

如果没有方案,输出零。

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1050;
int h1[N], h2[N], h3[N];
int n;

int main()
{
    scanf("%d", &n);
    int count = n;
    int idx = 1;
    while (count > 0)
    {
        char op[7];

        scanf(" %s", &op);
        for (int i = 2; i <= 5; i++)
        {
            char o = op[i];
            int t = 0;
            if (o >= '0' && o <= '9')
                t = o - '0';
            else
                t = o - 'A' + 10;

            h1[idx++] = (t & 8) >> 3;
            h1[idx++] = (t & 4) >> 2;
            h1[idx++] = (t & 2) >> 1;
            h1[idx++] = t & 1;
        }
        count -= 16;
    }

    int rf = -1, lf = -1;
    int fcnt = 0;

    for (int i = 1; i <= n; i++)
        if (h1[i] == 0)
        {
            if (rf == -1)
                rf = i;
            fcnt++;
        }
    for (int i = n; i > 0; i--)
    {
        if (h1[i] == 0)
        {
            lf = i;
            break;
        }
    }
    if (rf == -1)
        printf("0");
    else
    {
        bool flag1 = false;
        int offset1 = 0;
        int tempcnt = 0;
        for (int offset = 1; offset < rf; offset++)
        {
            tempcnt = 0;
            memset(h2, 0, sizeof h2);
            for (int i = rf; i <= lf; i++)
            {
                if (h1[i] == 0 && h1[i - offset] == 1)
                {
                    h2[i - offset] = 1;
                    tempcnt++;
                }
            }
            if (tempcnt == fcnt)
            {
                flag1 = true;
                offset1 = offset;
                break;
            }
        }

        bool flag2 = false;
        int offset2 = 0;
        tempcnt = 0;
        for (int offset = 1; offset < lf; offset++)
        {
            tempcnt = 0;
            memset(h3, 0, sizeof h3);
            for (int i = lf; i >= rf; i--)
            {
                if (h1[i] == 0 && h1[i + offset] == 1)
                {
                    h3[i + offset] = 1;
                    tempcnt++;
                }
            }
            if (tempcnt == fcnt)
            {
                flag2 = true;
                offset2 = offset;
                break;
            }
        }

        if (flag1 && flag2)
        {
            printf("2\n");
            printf("+%d\n", offset1);
            for (int i = 1; i <= n; i++)
                printf("%d", h2[i]);
            printf("\n-%d\n", offset2);
            for (int i = 1; i <= n; i++)
                printf("%d", h3[i]);
        }
        else if (flag1)
        {
            printf("1\n");
            printf("+%d\n", offset1);
            for (int i = 1; i <= n; i++)
                printf("%d", h2[i]);
        }
        else if (flag2)
        {
            printf("1\n");
            printf("-%d\n", offset2);
            for (int i = 1; i <= n; i++)
                printf("%d", h3[i]);
        }
        else
        {
            printf("0");
        }
    }
    return 0;
}

第二题:

讲的是两个“数”相加(有整数部分和小数部分)

“数”由0-9和'!','@','#'组成

题目规定了两个特殊字符相加得到的值,而且保证不会出现数字+特殊字符的情况

求最后的结果?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 1010;
char op[N];
int n;

int add(char a, char b)
{
    if (a == '!' && b == '!')
        return 0;
    if (a == '!' && b == '@')
        return 13;
    if (b == '!' && a == '@')
        return 13;
    if (a == '!' && b == '#')
        return 4;
    if (b == '!' && a == '#')
        return 4;
    if (a == '@' && b == '@')
        return 7;
    if (a == '@' && b == '#')
        return 20;
    if (b == '@' && a == '#')
        return 20;
    if (a == '#' && b == '#')
        return 5;

    return 1e9;
}

int main()
{
    scanf("%d", &n);
    scanf(" %s", op);
    vector<char> a1, a2, b1, b2;
    vector<int> ans1, ans2;
    bool flag = false;
    bool flag1 = false;
    bool flag2 = false;
    for (int i = 0; i <= n; i++)
    {
        if (op[i] == '+')
        {
            flag = true;
            continue;
        }

        if (!flag)
        {
            if (op[i] == '.')
            {
                flag1 = true;
                continue;
            }

            if (!flag1) // 整数
                a1.push_back(op[i]);
            else
                a2.push_back(op[i]);
        }
        else
        {
            if (op[i] == '.')
            {
                flag2 = true;
                continue;
            }

            if (!flag2) // 整数
                b1.push_back(op[i]);
            else
                b2.push_back(op[i]);
        }
    }

    int s = max(a1.size(), b1.size());
    while (a1.size() != s)
        a1.push_back('0');
    while (b1.size() != s)
        b1.push_back('0');
    reverse(a1.begin(), a1.end());
    reverse(b1.begin(), b1.end());

    int t = 0;
    for (int i = 0; i < s; i++)
    {
        if (a1[i] >= '0' && b1[i] <= '9')
        {
            t += (a1[i] - '0');
            t += (b1[i] - '0');
        }
        else
            t += add(a1[i], b1[i]);

        ans1.push_back(t % 10);
        t /= 10;
    }
    while (t)
    {
        ans1.push_back(t % 10);
        t /= 10;
    }
    reverse(ans1.begin(), ans1.end());

    s = max(a2.size(), b2.size());
    while (a2.size() != s)
        a2.push_back('0');
    while (b2.size() != s)
        b2.push_back('0');
    reverse(a2.begin(), a2.end());
    reverse(b2.begin(), b2.end());

    t = 0;
    for (int i = 0; i < s; i++)
    {
        if (a2[i] >= '0' && b2[i] <= '9')
        {
            t += (a2[i] - '0');
            t += (b2[i] - '0');
        }
        else
            t += add(a2[i], b2[i]);

        ans2.push_back(t % 10);
        t /= 10;
    }
    reverse(ans2.begin(), ans2.end());

    if (t)
    {
        reverse(ans1.begin(), ans1.end());
        for (int i = 0; i < ans1.size(); i++)
        {
            t += ans1[i];
            ans1[i] = t % 10;
            t /= 10;
        }
        while (t)
        {
            ans1.push_back(t % 10);
            t /= 10;
        }
        reverse(ans1.begin(), ans1.end());
    }

    for (int i = 0; i < ans1.size(); i++)
        printf("%d", ans1[i]);
    printf(".");
    for (int i = 0; i < ans2.size(); i++)
        printf("%d", ans2[i]);
    return 0;
}

全部评论
东南的✌🏻大可不必自我pua
4 回复 分享
发布于 2023-05-07 11:21 湖北
那是因为你没有ChatGPT
2 回复 分享
发布于 2023-05-08 19:53 上海
我也是,只有第二题a了50,觉得自己离这种大厂的距离还很大😭
2 回复 分享
发布于 2023-05-06 21:57 江苏
没事秋招再投 我也寄了
1 回复 分享
发布于 2023-05-07 00:49 江苏
只是因为刷题不够,这次基本没考算法,题刷熟了就行
点赞 回复 分享
发布于 2023-05-24 10:57 山东
刷题刷的少了 多刷题 加油
点赞 回复 分享
发布于 2023-05-15 08:24 广东
这次笔试寄的秋招还有机会吗,听有人说这就是秋招的笔试?不会吧
点赞 回复 分享
发布于 2023-05-12 16:36 北京
没事,秋招一起加油吧
点赞 回复 分享
发布于 2023-05-09 17:05 福建
多刷题
点赞 回复 分享
发布于 2023-05-09 11:45 上海

相关推荐

03-26 15:18
已编辑
华北水利水电大学 Java
点赞 评论 收藏
分享
04-21 11:22
已编辑
中华女子学院 UE4
点赞 评论 收藏
分享
评论
17
31
分享

创作者周榜

更多
牛客网
牛客企业服务