给定一组非负整数 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


/**
* @param {number[]} nums
* @return {string}
*/
var largestNumber = function(nums) {
// 先排序
nums.sort((a,b) => {
return `${b}${a}` - `${a}${b}`;
})
return nums[0] ? nums.join('') : '0'
};

我们分析一下规律:

当 nums = [10,2] 时,结果是 210。其实我们就是在比较 [10,2] 这两个数字能组合成的 210 和 102 哪个数字更大,显然 210 更大,所以需要把 2 放在前面。

为了避免用 int 型或者 long 型越界,所以我们需要把数字先转成字符串。然后可以把待比较的两个数字 x,y 组合成两个新的数字 string(x) + string(y) 和 string(y) + string(x) ,比较一下哪种组合构成的数字更大。

你可能会有疑问:如果拼接得到的字符串结果更大的话,那么原本的整型的数字拼接结果也一定更大吗?比如 "210" > "102",那么一定能得到 210 > 102 么?

答案是肯定的:首先拼接成的两个字符串一定是等长的。等长的字符串在比较的时候,是按照字符串的各个字符从前向后逐个比较的,所以相当于先比较了百分位,然后比较十分位,最后比较个位。所以在字符串等长的情况下,字符串大,那么对应的整型也更大。但两个不等长的字符串就没有这个结论了, 比如 "2" > "10",但是 2 < 10

作者:fuxuemingzhu