华为2018勇敢星实习软件类笔试4.10 (C++)

华为2018勇敢星实习软件类笔试4.10 (C++)


放一下本人拙劣的代码供大家参考,笔试题不是很难,非软件类专业 运气比较好 三题均一次过。
1.字符串重排
主要思路是将数字、字母出现的数量用数组f进行记录,按序输出就行。
#include<iostream>
#include<string>
using namespace std;

int main()
{

    char a[1000];
    int n=0;
    cin.getline(a,1000);
    while(a[n++]!='\0'){}
    n--;
    int f[62]={0};
    for (int i=0;i<n;i++)
    {
        if(a[i]>='0'&&a[i]<='9')
        {
            f[a[i]-48]++;
        }
        if(a[i]>='A'&&a[i]<='Z')
        {
            f[a[i]-55]++;
        }
            if(a[i]>='a'&&a[i]<='z')
        {
            f[a[i]-61]++;
        }
    }
    for (int j=0;j<n;j++)
    {
        for (int p=0;p<62;p++)
        {
            if (f[p])
            {
                if(p<=9)
                {
                    cout<<p;
                    f[p]--;
                }
                if(p>=10&&p<36)
                {
                    cout<<char(p+55);
                    f[p]--;
                }
                if (p>=36)
                {
                    cout<<char(p+61);
                    f[p]--;
                }
            }
        }
    }

    return 0;
}


2.跳跃比赛
这题应该是动态规划问题,我没有看过这方面的一时不知道怎么做,第三题做完回来想的,做了个假设,没想到直接通过了。假设按照这种方法青蛙可以用最小次数跳到最远:青蛙第一次跳跃的距离1~n 加上下一次可跳的最远距离最大的那一种方法。
#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n;
    int result=0;
    cin>>n;

    int *a=new int[n];
    for (int i=0;i<n;i++)
        cin>>a[i];
    int j=0;
    int max=0;
    int xia=0;
    while(j<n-1)
    {
        max=0;
        for (int p=1;p<=a[j];p++)
        {
            if (p+j>=n-1)
            {
                result++;
                j=n-1;
                break;
            }
            if (p+a[j+p]>max)
            {
                max=p+a[j+p];
                xia=j+p;
            }
        }
        if(j<n-1)
        {
        j=xia;
        result++;
        }
    }
    cout<<result;
    return 0;
}

3.大数相乘
这应该是一个经典问题,老实说我还真没看过,想了想乘法笔算的计算过程,对两个乘数进行倒序,不同位相乘得到的结果为数字单纯相乘的结果后面补上相应个数的0,比如4567*1234 其中的3*5得到的实际结果是15000,三个0分别来自1234一个,4567两个。
用result数组记录每一位的结果,大于十的扣除并进位,从低位开始乘记录好就行,每次要检查进位,然后逆序输出result。
#include<iostream>
#include<string>
using namespace std;

    
int main()
{
    int result[1000]={0};
    string str1,str2,str3;
    cin>>str1>>str2;
    int n1,n2;
    if (str1>=str2)
    {}
    else
    {
        str3=str2;
        str2=str1;
        str1=str3;
    }
    int mu=0;
    int jian=str2.length()-1+str1.length()-1;
   for (int i=str2.length()-1;i>=0;i--)
   {
       for (int j=str1.length()-1;j>=0;j--)
       {
            mu=(str2[i]-48)*(str1[j]-48);
            result[jian-i-j]+=mu%10;
            if (mu>=10)
                result[jian-i-j+1]+=mu/10;
            if (result[jian-i-j]>=10)
            {
                result[jian-i-j+1]+=result[jian-i-j]/10;
                result[jian-i-j]=result[jian-i-j]%10;

            }
       }
   }
   int t=-1;
   for (int k=999;k>=0;k--)
   {
       if (result[k]>0)
       {    t=k;
       break;
       }
   }
for (int h=t;h>=0;h--)
cout<<result[h];
    return 0;
}

总体难度不难,只是借助了代码来代替手动计算。欢迎大家交流。
顺便祈祷一下能够拿到offer。

#实习##春招##笔试题目##华为#
全部评论

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
评论
6
21
分享
牛客网
牛客企业服务