# 题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[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