📜  找出通过反转给定数字 N 的数字形成的最小数字(1)

📅  最后修改于: 2023-12-03 15:10:05.434000             🧑  作者: Mango

反转数字得到最小数字

问题描述

给定一个正整数 N,将其数字反转,然后得到一个新的整数 M,要求 M 是所有可能的反转数字形成的整数中最小的一个。例如,当 N = 1234 时,M = 4321 是所有可能的反转数字形成的整数中最小的一个。

要求实现一个函数,输入一个正整数 N,输出相应的 M。

思路分析

一个数字的反转可以通过取模和整除操作实现。对于正整数 N,我们可以不断模 10 取得最低位的数字,然后将其加到结果中。具体来说,可以用以下方法得到 N 的反转数字:

reverse(N):
  M = 0
  while N > 0:
    M = M * 10 + N % 10
    N = N // 10
  return M

将 N 和 M 比较大小,得到最小数字。

但是上面的方法并不能得到最小数字,因为当有多个数字反转后可以得到同一个数时,我们需要保证最低位的数字越小,反转后的数字越小,才能得到最小数字。

比如,当 N = 3050 时,根据上面的方法得到 M = 503,这明显不是最小数字。正确的反转方法应该是:

  • 当最低位为 0 时,将其移到最高位;
  • 将第二低位移到最低位;
  • 将剩余数字按从大到小的顺序排列。

具体来说,可以使用以下方法得到反转后最小数字:

  1. 将 N 转换成字符串,按照字符从小到大的顺序排序。
  2. 如果字符串的第一个字符是 '0',则将其和第一个不是 '0' 的字符交换位置。
  3. 将字符串转换成数字,得到反转后的最小数字 M。
代码实现

下面是 Python 代码实现:

def reverse_digits(n: int) -> int:
    m = 0
    while n > 0:
        m = m * 10 + n % 10
        n //= 10
    return m

def reverse_sort_digits(n: int) -> int:
    digits = list(str(n))
    digits.sort()
    if digits[0] == '0':
        for i in range(1, len(digits)):
            if digits[i] != '0':
                digits[0], digits[i] = digits[i], digits[0]
                break
    return int(''.join(digits[::-1]))

def find_minimum_reverse(n: int) -> int:
    return reverse_sort_digits(n)

print(find_minimum_reverse(1234)) # 4321
print(find_minimum_reverse(3050)) # 503

其中,reverse_digits(n) 是第一种反转方法,reverse_sort_digits(n) 是第二种反转方法,find_minimum_reverse(n) 是完整实现函数。

测试结果:

4321
503