网络异常,图片无法展示
|
「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
给定一组非负整数 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
解题思路
本题要求我们重新排列输入输入中数字的顺序,使其拼接后的数字最大。
这里我们先思考只有两个数字的时候,如何判断先后顺序呢?
我们可以比较 a 拼接 b 的结果和 b 拼接 a 的结果哪个更大,如果前者更大,则应该让 a
在 b
的前面,反之则应该让 b
在 a
的前面。
基于以上思考,我们可以把它作为排序的规则,然后利用 sort
排序排序输入数组。
数组排序后我们通过 join
方法获取数字拼接后的字符串即可。
但是到了这里还没有结束,因为输入数据可能存在 [0,0]
的情况,此时转成的字符串表示的数字会有前置 0
,我们需要处理这样的情况。
这里可以定义一个指针初始化为下标 0
,如果当前字符是 0
的话,让其一直向后移动,找到第一个非 0
位置,然后截取剩余部分即可。这里要注意的是 l
的最大值应该是字符串长度 -2
,因为我们要保证结果为非空字符串。
代码实现
var largestNumber = function (nums) { // 利用 sort 排序输入数组 // 排序规则是拼接 a,b,如果 a 拼接 b 后的结果字符串更大,则让 a 在 b 前 // 否则让 b 在 a 前 nums.sort((a, b) => (a + '' + b > b + '' + a ? -1 : 1)) // 利用排序后的数组转成字符串 const s = nums.join('') // 因为会存在 [0,0] 这样的输出数据,所以此时的结果数字可能会有前置 0 // 初始化 l 指针为 0 let l = 0 // 当 l 指针没到字符串的倒数第二位(这里是因为我们要保证结果为非空字符串) // 如果当前字符为 0,向后移动 l 指针 while (l < s.length - 1 && s[l] === '0') l++ // 返回从 l 指针位置截取之后的结果 return s.substr(l) } 复制代码
至此我们就完成了 leetcode-179-最大数
如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻