[路飞]_程序员必刷力扣题: 179. 最大数

172 阅读1分钟

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

179. 最大数

给定一组非负整数 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

排序

思路 由题目可知,我们需要对给定的数组nums中的元素进行排序,使得最后所有元素按照排列顺序拼接在一起的数字是最大的数字。

很明显对于个位数的话我们肯定是希望越大的数字越靠前,因此我们需要按照一下规律进行排序

  • 首先获取这个数字的最左侧的数字,这里我们通过转为字符串获取第0位来获取,我们记为p
    • 两个数字不相等,直接让大的排在前面
    • 如果相等,我们就需要去获取第2位数字继续进行比较,直到末尾

可是,如果比较的两个数字的长度不一致,前几位数字完全文和要怎么处理呢?

这个时候我们会惊喜的发现,这不就是两个数字你前我后进行组合,只有两种情况,比较两者的值即可,这不就完了吗?

于是我们直接用sort进行排序,排序规则就是获取两个数字a和b的两种组合结果,res1(a靠前)和res(b靠前)

因为我们要求最大的数字,所以我们这里需要一个降序排序

  • 组合结果大的往前,如果res1大,那就不要排序,返回一个负值即可
  • 组合结果小的往后,如果res2大,那么就需要交换a,b的位置,返回一个正值即可
  • 组合结果不变的,无需处理,返回0

因此我们直接返回res2-res1即可得到正确结果

最后我们将nums用join方法,用引号''将每一位元素拼接成字符串返回即可

var largestNumber = function (nums) {
    // 开始排序
    nums.sort((a, b) => {
        var strA = a.toString()
        var strB = b.toString()
        var res1 = parseInt(strA + strB)
        var res2 = parseInt(strB + strA)
        return res2 - res1
    })
    var res = nums.join('')
    if (res[0] === '0') {
        return '0'
    }
    return res
};