# 题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321]
,则打印出这三个数字能排成的最小数字为 321323
# 测试用例
用例1:
- 输入:
[10,2]
- 输出:
"102"
用例2
- 输入:
[3,30,34,5,9]
- 输出:
"3033459"
# 思路
将数组中的数字连接起来,排成一个最小的数字。将'大数'往后放'小数'往前放,如何定义'大数'和'小数'?比如说有两个数 a 和 b,如果 ab>ba
则 a 是'大数'b 是'小数',要排成 ba。
于是,这道题目变成了一个排序问题,将能把组合出来的数字变大的数字往后排。我们这里需要自己定义一个比大小的比较方法。用冒泡排序,可以解决此题。
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入nums: ");
let nums = readline().split(",").map(Number);
// 对于每个数来说求个位只需对 10 取余(%10),
// 然后将原数除以 10 取整,再对 10 取余拿到十位...依次类推
// 枚举统计每一个数位含有1的个数,同时记录总数,最后返回总数即可
// 比如判断12,就计算1-12之间1,2,3,4 —— 12 每个数位中含有1的个数
/**
* @param {number[]} nums
* @return {string}
*/
var minNumber = function (nums) {
// 利用sort方法来实现冒泡排序
// 把nums中元素的各种组合方式进行排序 —— 小的放在前边
// 比如ab < ba,那就把ab放到ba前面
nums.sort((a, b) => {
return "" + a + b < "" + b + a ? -1 : 1;
});
return nums.join("");
};
const res = minNumber(nums);
console.log("结果为: ", res);
/*
请输入nums:
3,30,34,5,9
结果为: 3033459
请输入nums:
3,32,321
结果为: 321323
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41