Description
题目来自腾讯笔试题。
给定N个非负整数,现需要将他们重新排列并拼接,使得最后的结果最大,输出这个结果。
注意不能简单比大小进行拼接,比如321和32,显然32放前面结果(32321)会更大。
输入格式
第一行一个整数N。(1<=N<=1000) 第二行N个非负整数,每个整数值不大于1000。
输出格式
拼接后的最大整数。
输入样例
2
321 32
输出样例
32321
思路
对数组进行排序,每次拿两个数字a和b进行比较,判断数字组合“ab”大,还是“ba”大。
比如32和321,“32 321”比“321 32”要大。
那么32则排在321前面,即a排在b前面。
计算思路:
将a乘以10的(b的位数)次方,再加上b即可得到数字组合num1:”ab“;
比如32×10(321的位数)= 32×103 = 32000
再加上321得到 32321
同理计算num2:“ba”
比较后即可进行排序
源码:
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
int w1=1,w2=1; //10的(a,b位数次方)。比如a为1234,则w1为1000
int x=a,y=b;
while(x>0) //循环计算w1
{
x/=10;
w1*=10;
}
while(y>0) //循环计算w2
{
y/=10;
w2*=10;
}
int num1=a*w2+b; //把a的值空出(b的位数数量)的0,即a*w2,再加上b,把b补到后面,形成一个数字
int num2=b*w1+a; //同上
if(num1>num2) //判断a,b哪个数字放前面会比较大,进行排序
return true;
else
return false;
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);
for(int i=0;i<n;i++) //直接输出即可
cout<<a[i];
}