18963 最大数字(c++)
题目来自腾讯笔试题
给定N个非负整数,现需要将他们重新排列并拼接,使得最后的结果最大,输出这个结果。
注意不能简单比大小进行拼接,比如321和32,显然32放前面结果(32321)会更大。
输入格式
第一行一个整数N。(1<=N<=1000)
第二行N个非负整数,每个整数值不大于1000。
输出格式
拼接后的最大整数。
输入样例
2
321 32
输出样例
32321
思路:
将两个字符串两两组合,比较两个数组s1和s2,如果s1+s2>s2+s1,则s1>s2,然后判断是否要交换。用冒泡排序交换两数组,接着执行下一遍交换。
#include<iostream>
using namespace std;
#include<string.h>
int combin(char b[],char c[])//将两个字符串进行组合
{
int i,j;
char d[45];//组合后的字符串
for(i=0; i<strlen(b); i++)
{
d[i]=b[i];
}
for(i=strlen(b),j=0; i<(strlen(c)+strlen(b))&&j<strlen(c); j++,i++)
{
d[i]=c[j];
}
d[i]='\0';//尾部补上
return atoi(d);//atoi c标准库中的函数 使字符类型变整形
}
int main()
{
int n,i,j;
cin >> n;
char a[n+5][20],t[20];//二维数组用来存储各字符串,一维用于交换媒介
for(i=0; i<n; i++)
cin >> a[i];
for(i=0; i<n-1; i++)//冒泡排序方法进行排序
{
for(j=0; j<n-1-i; j++)
{
if(combin(a[j],a[j+1])<combin(a[j+1],a[j]))
{
strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
}
}
}
for(i=0; i<n; i++)//最后输出
for(j=0; j<strlen(a[i]); j++)
cout << a[i][j];
}
运行结果如下: