给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [1]
输出:“1”
示例 4:
输入:nums = [10]
输出:“10”
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
这题的思路我自己做的时候是没啥思路的,用了没有严谨推理的比较,最后测试用例也只a了五十那样,于是马上跑来学习。
这题具体的做法是用贪心算法结合compareTo来做,我们算出每一步的最佳选择,然后一步一步得到全局的最佳选择。
代码
class Solution {
public String largestNumber(int[] nums) {
String[] array = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
array[i] = String.valueOf(nums[i]);
}
Arrays.sort(array, (o1, o2) -> {
return (o2 + o1).compareTo(o1 + o2);
});
//如果排序后的第一个元素是0,那后面的元素肯定小于或等于0,则可直接返回0
if (array[0].equals("0")) {
return "0";
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < array.length; i++) {
builder.append(array[i]);
}
return builder.toString();
}
}
这里摘抄题解一部分对于compareTo的说法
将数组内元素逐个转化为字符串后,直接通过compareTo方法比较
a.compareTo(b):它是从头开始比较对应字符的大小(ASCII码顺序)
如果a的第一个字符和b的第一个字符不等,结束比较,返回他们之间的长度差值
如果a的第一个字符和b的第一个字符相等,则a的第二个字符和b的第二个字符做比较
以此类推,直至比较的字符或被比较的字符有一方结束。
补充一下
Array.sort()中如果使用自定义比较器Comparator
规则是对于参与比较的两个元素(a,b)而言,若返回值为正数则说明发生交换
当前比较器规则为(b+a).compareTo(a+b),如果大于0,Comparator接收返回值为正数,就会交换a和b
提醒[0,0]这个测试用例,最后要判断一下。
作者:wangqiangustb
链接:https://leetcode-cn.com/problems/largest-number/solution/java-jiang-shu-zu-zhuan-hua-wei-zi-fu-ch-ikrv/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。