重排数字的最小值

给你一个整数 num 。重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零。
返回不含前导零且值最小的重排数字。
注意,重排各位数字后,num 的符号不会改变。

  • 输入:num = 310

  • 输出:103

  • 解释:310 中各位数字的可行排列有:013、031、103、130、301、310 。
    不含任何前导零且值最小的重排数字是 103 。

  • 输入:num = -7605

  • 输出:-7650

  • 解释:-7605 中各位数字的部分可行排列为:-7650、-6705、-5076、-0567。
    不含任何前导零且值最小的重排数字是 -7650 。

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
var smallestNumber = function(num) {
const nums = [];
// 标记是否是负数
let isNeg = false;
if (num < 0) {
num = -num;
isNeg = true;
}
// 获取每位数
while (num) {
nums.push(num % 10);
num = Math.floor(num / 10);
}
nums.sort((a, b) => a - b);

const res = [];
const len = nums.length;
for (let i = 0; i < len; i++) {
// 负数,从大到小排
// 正数,从小到大排
res.push(isNeg ? nums[len - i - 1] : nums[i]);
}
if (!isNeg) {
// 正数还需要将第一个不为0的数,与第一位数调换位置
for (let i = 0; i < res.length; i++) {
if (res[i] !== 0) {
[res[i], res[0]] = [res[0], res[i]];
break;
}
}
}

return isNeg ? -Number(res.join('')) : Number(res.join(''));
};