# 最大数(179)
# 题目
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
# 示例
输入:nums = [10,2]
输出:"210"
输入:nums = [3,30,34,5,9]
输出:"9534330"
输入:nums = [1]
输出:"1"
输入:nums = [10]
输出:"10"
# 提示
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 109
# 算法
# 排序
对于要组成最大的数,我们自然想到比较每一个数字的最高位,将高位大的数字放在前面,如果高位相同则继续比较此高位,以此类推
这种方法对于没有相同开头的数字是有效的,但是如果遇到数组中存在相同开头的数字就失效了,比如
[16, 165]
此时我们可以比较"16" + "165"
和"165" + "16"
哪一个更大,来决定将哪一个数字放在最前面
这里因为16516
大于16165
,所以我们将165
放在16
前面
当然,这个判断对于没有相同开头的数字也是有效的:
const largestNumber = nums => {
nums.sort((a, b) => {
let ab = "" + a + b;
let ba = "" + b + a;
if (ab > ba) return -1;
else if (ab < ba) return 1;
else return 0;
});
if (nums[0] === 0) return "0";
return nums.join("");
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11