[路飞]_6001.重排数字的最小值
「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
题目
给你一个整数 num 。重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零。
返回不含前导零且值最小的重排数字。
注意,重排各位数字后,num 的符号不会改变。
示例1
输入:num = 310
输出:103
解释:310 中各位数字的可行排列有:013、031、103、130、301、310 。
不含任何前导零且值最小的重排数字是 103 。
示例2
输入:num = -7605
输出:-7650
解释:-7605 中各位数字的部分可行排列为:-7650、-6705、-5076、-0567。
不含任何前导零且值最小的重排数字是 -7650
题解
模拟
分析重要条件:
- 不含前导零
- 值最小
- 重排数字
- 数字重排后,符号不会改变
- 整数范围 −1015 <=num<=1015-10^{15} <= num <= 10^{15}−1015 <=num<=1015
含有负数;需要分类讨论
- 当 numnumnum 为负数,将 numnumnum 从大到小排列,将排列后的字符串转换为整数并添加符号即可。
- 当 numnumnum 为正数,将 numnumnum 从小到大排列, 还需要分类讨论是否含有前导零。
- 如果没有前导零,将排列后的字符串转换为整数返回
- 有前导零,需要获取第一个非零数字,将第一个非零数字与数组第一个0交换位置,将数组转换为字符串,字符串转换为整数返回
根据上述思路编辑代码如下:
注:
- 因为在JavaScript中没有直接将字符从大到小排列排列的方式,需要将字符串转换为数组,调用数组排序方式排序,然后再将数组转换为字符串
var smallestNumber = function (num) {
if (num === 0) return num
let n = num
let sign = true
if (n < 0) {
sign = false
n = -n
}
const s = String(n).split('')
if (sign) {
const list = s.sort((a, b) => a - b)
let index = 0
while (list[index] === '0') {
index++
}
const t = list[index]
list[index] = 0;
list[0] = t
return Number(list.join(''))
} else {
const list = s.sort((a, b) => b - a)
return 0 - list.join('')
}
}
作者水平有限,如有问题欢迎评论区讨论。
更新于2022.02.10
压缩状态
整数 numnumnum 使用的字符在[0,9][0,9][0,9] 区间,可以将整数 numnumnum 存放到一个长度为 101010的数组,数组下标表示一个整数字符,数组元素表示元素所在下标整数字符出现的次数;
枚举整数 numnumnum,将所有字符存放到 listlistlist 数组;根据 整数 numnumnum 是正还是负选择正序还是倒序输出listlistlist
注意:不含前导 0
感谢:评论区李哪吒指点
完整代码
var smallestNumber = function (num) {
const list = Array(10).fill(0);
const s = num > 0 ? String(num) : String(-num);
for (let i = 0; i < s.length; i++) {
list[s[i]]++;
}
let result = '';
if (num > 0) {
let frist = null;
for (let i = 1; i < 10; i++) {
if (list[i] > 0) {
frist = i;
break;
}
}
result += frist;
for (let i = 0; i < 10; i++) {
if (list[i] > 0) {
result += Array(i === frist ? list[i] - 1 : list[i])
.fill(i)
.join('');
}
}
return result;
} else {
for (let i = 9; i >= 0; i--) {
if (list[i] > 0) {
result += Array(list[i]).fill(i).join('');
}
}
return 0 - result;
}
};
转载自:https://juejin.cn/post/7061514856515502093