# 剑指45. 把数组排成最小的数(快速排序)

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

输入:[10,2]
输出:'102'

输入: [3,30,34,5,9]
输出: '3033459'
1
2
3
4
5

# 思路

在 js 中,可以通过参数将自定义的「排序依据」作为函数传入 sort 中,这个函数的逻辑是:

  • 如果 a + b < b + a,说明 abba 小,a 应该在 b 前面,返回-1
  • 如果 a + b > b + a,说明 abba 大,a 应该在 b后面,返回 1 如果相等,返回 0
/**
 * @param {number[]} nums
 * @return {string}
 */
var minNumber = function(nums) {
    nums.sort((a, b) => {
        const s1 = a + "" + b;
        const s2 = b + "" + a;

        if (s1 < s2) return -1;
        if (s1 > s2) return 1;
        return 0;
    });
    return nums.join("");
};
// 时间复杂度:O(NlogN)O(NlogN

// 一行代码实现
var minNumber = function(nums) {
    return nums.sort((a, b) => (''+a+b) - (''+b+a)).join('')
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 179. 最大数

给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

输入:nums=[10,2]
输出:"210"

输入:nums=[3,30,34,5,9]
输出:'9534330'

输入:nums=[1]
输出:'1'

输入:nums=[10],
输出: '10'
1
2
3
4
5
6
7
8
9
10
11
/**
 * @param {number[]} nums
 * @return {string}
 */
var largestNumber = function(nums) {
    nums.sort((a,b) => {
        var s1 = a + '' + b
        var s2 = b + '' + a
        if(s1 > s2) return -1
        if(s2 > s1) return 1
        return 0
    })
    return nums[0] ? nums.join('') : '0'
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14