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;
}
总体难度不难,只是借助了代码来代替手动计算。欢迎大家交流。