题目: Given a list of non negative integers, arrange them such that they form the largest number.
例子: 给定由非负整数组成的数组[3, 30, 34, 5, 9]
, 它们所组成的最大整数为: 9534330
.
第一眼看到这题目,脑中闪现的思路就是:先找出各个数的首位数字,然后从大到小排序,首位数字相同再比较第二位数字的大小,写了一段时间后,发现写不下去了,因为当两个数的前几位数字相同时,还得考虑多出来的那位数字的大小问题,比如
121,12 组成12121,
122,12组成12212, 即多出来的那位数字必须大于最后一位相同的数字,感觉走不下去了。
于是决定转换思路:从最后的结果来看,它是通过对原来的数组中的元素进行调换顺序后,顺序输出得出的。 两个元素调换顺序的规则是:比较两个元素在不同顺序下所组成的数的大小。比如两个数:a,b ,需要比较数ab和ba的大小。
因此就有了下面的代码(java):
public class Solution {
public String largestNumber(int[] arr) {
String[] strs = new String[arr.length];
for(int i=0; i<arr.length; i++) {
strs[i] = Integer.toString(arr[i]);
}
Arrays.sort(strs, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String ss1 = s1 + s2;
String ss2 = s2 + s1;
int i=0;
while(i<ss1.length()) {
if(ss1.charAt(i)!=ss2.charAt(i)) {
return ss1.charAt(i) - ss2.charAt(i);
}
++i;
}
return 0;
}
}
);
StringBuilder sb = new StringBuilder();
for(int i=strs.length-1; i>=0; i--) {
sb.append(strs[i]);
}
return sb.toString().replaceFirst("^0+(?!$)", "");
}
}