[路飞]最大数

68 阅读2分钟

记录 1 道算法题

最大数

179. 最大数 - 力扣(LeetCode) (leetcode-cn.com)


要求:提供一个数组,将里面的数字做字符串拼接,不可以拆数字,可以调换数字的位置,返回拼接出来最大的字符串。

比如: [10,2], 输出: '210'

其实只要做到局部最优,把开头大的数字放到最前面,那么拼出来的数一定是最大的,比如把 9 开头的放在第一位,那么就是最大的。

所以排序的时候要从每一个数字的左边第一位开始比较,将大的放前面,如果相等则比较第二位,以此类推,将最大的放在前面。但是这样的比较很复杂,有很多种情况,因为数字的位数不一样。

这时可以使用一个简单的办法,也是局部最优的思想,只要将数字做两种拼接,一种是自己在前面,一种是自己在后面。这样就可以比较出大小,只要将大的结果往前放,总体就是最大的。

另外还要处理 [0,0] 的情况,我们可以做一种假设,如果出现了 0,毫无疑问在比较中会把 0 放到后面,因为他在前面的拼接结果更小,所以在这种情况下,0 是不可能出现在排序后的数组的第一位。如果有,说明都是 0。比如 [9,0,8,2,0],明显 0 会聚集在后面 '98200'

完整代码如下:

    function largestNumber(nums) {
        // sort 会反着传入参数
        const compare = (a, b) => {
            // 如果后面的数是 0,不做交换
            if (a == '0') return 1
            // 如果前面的数是 0,做交换
            else if (b == '0') return -1
            // 比较两种拼接方式
            return Number(b + a) - Number(a + b)
        }
        // 排序
        nums.sort((a,b) => compare(String(a), String(b))
        // 排序后第一位出现 0 的情况
        if (nums[0] == 0) {
            return '0'
        }
        // 正常情况输出字符串
        return nums.join('')
    }