给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:
nums = [10,2]
输出:"210"
示例 2:
输入:
nums = [3,30,34,5,9]
输出:"9534330"
提示:
1 <= nums.length <= 1000 <= nums[i] <= 10^9
思路
本题求重新排列后组成的最大整数,那么我们就要在相同的位置上尽量放置可能大的数。具体到两个数 a 和 b 比较,
- 如果他们首位不相等,首位大的排列在前,比如
5和30,5排在30前面,即530 - 如果首位相等,再比较第二位,一直比较下去,直到有不相等的。比如
5231和524,524排在5231前面,即5245231 - 如果直到一个数比较完最后一位还相等,
523和52352,当523比较完了还无法确定那个在前,这时我们可以把52352拼接到523后面继续比较,当52352比较完了还无法确定,我们把523拼接到52352后面继续比较,如果比较完仍然相等,那么这两个排序顺序无所谓先后。
看着上面挺复杂的,其实说白了就是比较 ab 和 ba 的大小,当 ab > ba 时,a 应该排在 b 前,当 ab < ba 时,a 应该排在 b 后,当 ab = ba 时,a 和 b 的排序无所谓先后
解题
/**
* @param {number[]} nums
* @return {string}
*/
var largestNumber = function (nums) {
const ns = nums.map((n) => n.toString());
const compare = (a, b) => {
const temp = a;
a = a + b;
b = b + temp;
return +b - a;
};
ns.sort((a, b) => compare(a, b));
return ns.join("").replace(/^0+/, 0);
};