[路飞]_6001.重排数字的最小值

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

6001. 重排数字的最小值

题目

给你一个整数 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 
复制代码

题解

模拟

分析重要条件:

  • 不含前导零
  • 值最小
  • 重排数字
  • 数字重排后,符号不会改变
  • 整数范围 1 0 15   < = n u m < = 1 0 15 -10^{15} <= num <= 10^{15}

含有负数;需要分类讨论

  • n u m num 为负数,将 n u m num 从大到小排列,将排列后的字符串转换为整数并添加符号即可。
  • n u m num 为正数,将 n u m num 从小到大排列, 还需要分类讨论是否含有前导零。
    • 如果没有前导零,将排列后的字符串转换为整数返回
    • 有前导零,需要获取第一个非零数字,将第一个非零数字与数组第一个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('')
  }
}
复制代码

作者水平有限,如有问题欢迎评论区讨论。

猜你喜欢

转载自juejin.im/post/7061514856515502093