华为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;
}
#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;
}
#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;
}
#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。