欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为2018勇敢星实习软件类笔试(3题)4.10版

程序员文章站 2024-03-15 16:15:18
...

1.字符串重排

如图

华为2018勇敢星实习软件类笔试(3题)4.10版

主要思路是将数字、字母出现的数量用数组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.跳跃比赛

如图

华为2018勇敢星实习软件类笔试(3题)4.10版


这题应该是动态规划问题,我没有看过这方面的一时不知道怎么做,第三题做完回来想的,做了个假设,没想到直接通过了。假设按照这种方法青蛙可以用最小次数跳到最远:青蛙第一次跳跃的距离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.大数相乘

如图

华为2018勇敢星实习软件类笔试(3题)4.10版


这应该是一个经典问题,老实说我还真没看过,想了想乘法笔算的计算过程,对两个乘数进行倒序,不同位相乘得到的结果为数字单纯相乘的结果后面补上相应个数的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;
}

总体难度不难,只是借助了代码来代替手动计算。欢迎大家交流。

华为2018勇敢星实习软件类笔试(3题)4.10版