题目描述
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
样例
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [1]
输出:“1”
示例 4:
输入:nums = [10]
输出:“10”
思路
将数组元素按照某种规则排序,最后再拼起来就行啦~
对于任意两个元素串 A 和 B,依次对它们对应位置的字符进行笔记,如果发现在位置 i 的字符不同,那么就把大的放在前面,本次比较就结束了。
如果一个串是另一个串的前缀,比如 123 和 12345 ,这时就需要进行递归比较,把长串的剩余部分与短串继续进行比较,对于上面的例子,就是把 123 和 45 进行比较,由于 1 < 4,所以第一轮递归时就可以将12345排在123前面。
排序调用 java 的 sort 函数就行啦,但是规则需要自己定义~
另外需要注意的是,最后结果的字符串可能是00000…xxxxxx,这里有很多前导0,对于输出来说是非法的,所以要去除一下前导0,只要找到第一个非0字符,然后从它开始输出就行啦~
代码
public class Solution {
public String largestNumber(int[] nums) {
//字符串数组
String sNums[] = new String[nums.length];
for(int i = 0;i < nums.length;i++)
sNums[i] = String.valueOf(nums[i]);
//比较类对象
Comparator cmp = new MyComparator();
Arrays.sort(sNums,cmp);
//存结果
StringBuilder s = new StringBuilder("");
for(int i = 0;i < sNums.length;i++)
s.append(sNums[i]);
int flag = -1;
for(int i = 0;i < s.length();i++) {
if(s.charAt(i) != '0') {
flag = i;
break;
}
}
//全是0
if(flag == -1)
return "0";
else
return s.substring(flag,s.length());
}
}
class MyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
// TODO 自动生成的方法存根
int len1 = o1.length();
int len2 = o2.length();
for(int i = 0;i < Math.min(len1, len2);i++) {
if(o1.charAt(i) != o2.charAt(i)) {
int tmp = (o2.charAt(i) -'0') - (o1.charAt(i) - '0');
return tmp;
}
}
//前缀都一样,那将短串和长串剩余部分继续比较
if(len1 > len2) {
return compare(o1.substring(len2, len1),o2);
}
else if(len2 > len1) {
return compare(o1,o2.substring(len1,len2));
}
else {
return 0;
}
}
}