问题描述:
给出一个整型数组,所有数字均>=0,问如何组合集中的数字才能形成一个最大的数字。
例如给出:[3, 30, 34, 5, 9]
, -----> 9534330
.
思路:本人从字符串排序的角度考虑,试图将所有数字看成字符串一起去排序,但是过程极其繁琐,放弃。于是考虑从小范围开始排序,不在放眼全局。例如先将前两个3,30进行排序--->可以组成330和303两种,显然选择330这种顺序。再讲第三个数字拿过来,是放在3左边呢,还是放在3和30中间呢,还是放在30后边呢?显然将某数字放在最左侧,表明以这个数字开头的组合是最大的;反之,放在最右侧说明这个数字不合适放在其他所有数字的前边(废话)。
规律总结为:每拿到一个新数字,遍将它与在它之前的所有已经排好序的数字进行组合后的比较----->这不就是插入排序啊!!!
AC代码:
class Solution {
public String largestNumber(int[] nums) {
for (int i = 1; i < nums.length; i++) {
int j = i;
int temp = nums[j];
while (j > 0 && (String.valueOf(temp) + String.valueOf(nums[j - 1])).compareTo((String.valueOf(nums[j - 1]) + String.valueOf(temp))) >= 0)
//System.out.println();
{
nums[j] = nums[j - 1];
j--;
}
nums[j] = temp;
}
String sum="";
for (int i = 0; i < nums.length; i++) {
sum+=String.valueOf(nums[i]);
}
if(sum.indexOf("0")==0)sum="0";
return sum;
}
}