一、题目描述:
给定一组非负整数 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('') };
四、总结:
此题考查的是排序。需要对几种常用的排序熟练掌握,并运用到不同的场合当中。
作者:ClyingDeng
链接:https://juejin.cn/post/6950266406206341156
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。