1 题目描述
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。leetcode 179 最大数
- 示例1
输入:[10,2]
输出:"210"
2 题目分析
首先想到的思路是对数组排序,如果全是个位数的话,越大的数越往前排。然后组成字符串即可。
如果一个个位数和一个两位数比较,第一个位置大的排在前面(34和4比较的话,4应该排在前面);如果个位相同的话(3和34),应该拿着剩下的数4再和个位去比较。
如果所有位置都比较完了,仍没有比较出结果,则位置不用动(如123和123123),谁在前组成的数都一样
3 代码
public static String largestNumber1(int[] nums) {
//把基本数据类型转为包装类型的数组
Integer[] array = new Integer[nums.length];
int start =0;
for(int i : nums){
array[start ++] = i;
}
Arrays.sort(array,new Comparator<Integer>() {
@Override
public int compare(Integer a1, Integer a2) {
String s1 = String.valueOf(a1);
String s2 = String.valueOf(a2);
int length1 = s1.length(), length2 = s2.length();
int i = 0, j = 0;
while (i < length1 && j < length2) {
if (s1.charAt(i) > s2.charAt(j)) {
return -1;
} else if (s1.charAt(i) < s2.charAt(j)) {
return 1;
}
i++; j++;
if (i == length1 && j < length2) {
i = 0;
}
if (i < length1 && j == length2) {
j = 0;
}
}
//都循环完了,没有比较出来,说明谁在前都一样,保持位置不用调换
return 0;
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < nums.length; i ++){
sb.append(array[i]);
}
return sb.toString();
}