2165 重排数字的最小值(模拟)

1. 问题描述:

给你一个整数 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 。

提示:

-10 ^ 15 <= num <= 10 ^ 15

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/smallest-value-of-the-rearranged-number/

2. 思路分析:

分析题目可以知道对于非正数来说其实比较好处理,我们只需要将num中的各位数字大到小进行排序即可,因为当存在0的时候0一定会排列在最后面,对于正数而言我们可以先将num中的各个位置上的数字从小到大进行排序,然后找到第一个不是0的位置将这个位置与0这个位置上的数字交换那么就是最终的结果,因为使用的是python语言所以可以将数字先存储到列表中然后进行交换数字的操作。

3. 代码如下:

from typing import List


class Solution:
    # 将十进制数字num转换为列表
    def numToList(self, num: int):
        a = list()
        while num > 0:
            a.append(num % 10)
            num //= 10
        return a

    # 将nums转为十进制数字
    def listToNum(self, a: List[int]):
        res = 0
        for i in range(len(a)):
            res = res * 10 + a[i]
        return res

    def smallestNumber(self, num: int) -> int:
        # 当num小于等于0的时候直接将num中的各个数字从大到小排序即可
        if num <= 0:
            a = self.numToList(-num)
            a.sort(reverse=True)
            return -self.listToNum(a)
        # num为正数
        a = self.numToList(num)
        a.sort()
        i = 0
        # 从小到大排序之后之后找到第一个不是0的数字与第一个位置的数字交换即可
        while i < len(a) and a[i] == 0: i += 1
        if i < len(a):
            a[0], a[i] = a[i], a[0]
        return self.listToNum(a)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值