[路飞]_leetcode-179-最大数

简介: leetcode-179-最大数

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


给定一组非负整数 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 的结果哪个更大,如果前者更大,则应该让 ab 的前面,反之则应该让 ba 的前面。


基于以上思考,我们可以把它作为排序的规则,然后利用 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-最大数


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章