likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 102

「这是我参与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 

题解

模拟

分析重要条件:

  • 不含前导零
  • 值最小
  • 重排数字
  • 数字重排后,符号不会改变
  • 整数范围 −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
评论
请登录