题目描述
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
输入: [3,30,34,5,9]
输出: "3033459"
一般思路
当看到这个题的时候我们的思路是先将整数数组转换成字符串数组,然后进行排序,再将排序后的字符串拼接返回即可。但是如何比较两个字符串的大小呢?有人会用String类自带的compareTo()函数进行比较,但是这个函数只有当两个字符串的长度一样长的时候才能准确比出大小,如果两个字符串的长度不一样的时候比出来的大小顺序有肯能并不是我们需要的顺序。比如"3"和"30",如果我们用compareTo()函数比较会得到"3"<“30”,得到的拼接串为"330",而实际拼接串"303"才是我们要的结果。
为了比较两个长度不同的字符串的大小就需要我们自定义一个比较函数,我的第一想法是先将长的字符串截断和短的字符串一样长,然后用compareTo()函数比较一样长的部分,如果分出大小就返回,如果分不出大小,则用同样的方法比较短的字符串和长的字符串剩余部分的大小。
如"3"和"30",先比较"3"和"3"是相等的,然后比较"3"和"0"是"3">“0”,所以返回"3">“30”。
int compare(String s1,String s2){
if(s1.length()==s2.length()){
return s1.compareTo(s2);
}else if(s1.length()<s2.length()){
int res=s1.compareTo(s2.substring(0,s1.length()));
if(res<0){
return -1;
}else if(res>0){
return 1;
}else{
return compare(s1,s2.substring(s1.length()));
}
}else{
int res=s1.substring(0,s2.length()).compareTo(s2);
if(res<0){
return -1;
}else if(res>0){
return 1;
}else{
return compare(s1.substring(s2.length()),s1);
}
}
}
拼接比较方法
上面的一般方法虽然能够比较出来大小,但是并不高效,如果将两个字符串s1和s2按先后不同的顺序进行拼接在一起就可以得到两个长度一样的字符串str1=s1+s2,str2=s2+s1,然后用compareTo()方法比较str1和str2的大小即可。
- str1=str2 说明s1=s2
- str1>str2 说明s1>s2
- str1<str2 说明s1<s2
比如s1=“3”,s2=“30”,则str1=“330”,str2=“303”,比较结果为str1>str2,则返回s1>s2。
int compare(String s1,String s2){
return (s1+s2).compareTo(s2+s1);
}