# 最大数(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