一、题目
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2] 输出:"210"
示例 2:
输入:nums = [3,30,34,5,9] 输出:"9534330"
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109
二、代码
class Solution {
class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
// 比较器写法一:
// Long ab = Long.valueOf(new StringBuilder().append(a).append(b).toString());
// Long ba = Long.valueOf(new StringBuilder().append(b).append(a).toString());
// return ab > ba ? -1 : 1;
// 比较器写法二:
String ab = new StringBuilder().append(a).append(b).toString();
String ba = new StringBuilder().append(b).append(a).toString();
// a拼接b的字典序 > b拼接a的字典序,则a放前,否则b放前
return ba.compareTo(ab);
}
}
public String largestNumber(int[] nums) {
// 需要将int数组转化为Integer数组才可以使用对数器
Integer[] ns = new Integer[nums.length];
// 标记数组中的数是否都是0,如果都是0就为false,否则为true
boolean flag = false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
flag = true;
}
ns[i] = nums[i];
}
// 如果数组中都是0,直接返回"0"。避免返回"000"这样的字符串
if (!flag) {
return "0";
}
// 按照比较器规则排序
Arrays.sort(ns, new MyComparator());
// 按照比较器规则排序完之后再将所有的字符都拼接起来就是答案。
StringBuilder res = new StringBuilder();
for (int i = 0; i < ns.length; i++) {
res.append(ns[i]);
}
return res.toString();
}
}
三、解题思路
这道题的贪心策略是:a拼接b的字典序 > b拼接a的字典序,则a放前,否则b放前。排序完之后再将所有的字符都拼接起来就是答案。