1.题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
2. 基本思路
我们将输入数组变换成字符串,如果我们能事先对其排序,如{‘3’,’32’,‘321’}排序成{‘321’,‘32’,’3‘},则最后再将排序好的字符串重新串连起来,那么就为要求的输出。
给定数字a,数字b,我们将其变成字符串。ab表示a加在b的前面,ba表示b加在a的前面。如a=’1’ ,b=’23’, 那么ab=’123’,ba=‘231’
新的字符串比较规则如下:
3.代码
- C++
bool cmp(const string&s1,const string&s2)
{
bool res=true;
string t1=s1+s2;
string t2=s2+s1;
return t1<t2;
}
string PrintMinNumber(vector<int> numbers) {
string res;
if(numbers.empty())
{
return res;
}
vector<string> source(numbers.size());
char a[32];
int i=0;
for(;i<numbers.size();++i)
{
sprintf(a,"%d",numbers[i]);
source[i]=a;
}
sort(source.begin(),source.end(),cmp);
print(source);
res=source[0];
i=1;
while(i<source.size())
{
res+=source[i++];
}
return res;
}
- python (python3中重定义比较规则和C++中sort函数不一样;并且python3中list的sort函数取消了cmp这个参数,无法将在函数中定义的规则直接传入,需要借助
functools
# -*- coding:utf-8 -*-
import functools
def cmp1(a,b):
t1=a+b
t2=b+a
if t1<t2:
return -1
elif t1==t2:
return 0
elif t1>t2:
return 1
class Solution:
def PrintMinNumber(self, numbers):
# write code here
numbers=[str(s) for s in numbers]
numbers.sort(key=functools.cmp_to_key(cmp1))
return "".join(numbers)