# 剑指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