# 剑指45. 把数组排成最小的数(快速排序)
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
输入:[10,2]
输出:'102'
输入: [3,30,34,5,9]
输出: '3033459'
 1
2
3
4
5
2
3
4
5
# 思路
在 js 中,可以通过参数将自定义的「排序依据」作为函数传入 sort 中,这个函数的逻辑是:
- 如果 
a + b < b + a,说明ab比ba小,a应该在b前面,返回-1 - 如果 
a + b > b + a,说明ab比ba大,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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14