本文正在参与掘金团队号上线活动,点击 查看详情
一、题目描述:
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例:
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:
输入:nums = [1]
输出:"1"
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 10^9
二、思路分析:
拿到题目,首先想到的时数组需要转成字符串数组、两者比较需要用到排序。 选择从大到小排序,数据的排序可以直接作为返回结果。
主要的核心是怎么比较。通过例子就可以看出,第一位最大的在前,依次类推。确定第一位大的后,在第一位相等的情况下,依次确定第二位大的、第三位大的。
例: nums = 128, 12, 320, 321, 32]
正常的想法应该是这样的:
第一位最大的是3,先将3开头的排序到最前面,1开头的放到3后面。 3开头,第二位大的是2无需调动。第三位较大的是1,所以将321放到最前面。
当遇到特殊情况时,就需要特殊处理。
但是我们可以直接借助sort排序,自定义一个sort规则。直接按照a+b < b+a的降序规则即可。
直接比较左右两个数按照不同的顺序拼接值的大小进行排序。
比如[10,2]: 210 > 102, 即数组排序为[2,10]。
例:
nums = 128, 12, 320, 321, 32]
三、AC 代码:
function largestNumber(nums) {
nums.sort((a, b) => b + '' + a - (a + '' + b))
if (nums[0] == 0) return '0'
console.log(nums);
return nums.join('')
}
// 法二 sort核心
function largestNumber(nums) {
for (let i = 0; i < nums.length - 1; i++) {
nums[i] = nums[i].toString()
for (let j = i + 1; j < nums.length; j++) {
nums[j] = nums[j].toString()
if (nums[i] + nums[j] < nums[j] + nums[i]) {
let temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
}
}
}
return nums.join('')
};
四、总结:
此题考查的是排序。需要对几种常用的排序熟练掌握,并运用到不同的场合当中。