📜  查找与给定数字 N 具有不同数字的下一个数字(1)

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

查找与给定数字 N 具有不同数字的下一个数字

对于一个给定的数字 N,要求找出比 N 大的、与 N 各位数字均不相同的最小整数。如果找不到这样的数,输出 -1。

例如,对于 123,应该输出 132;对于 129,应该输出 192;对于 9876543210,应该输出 -1。

下面是一个 Python 实现:

def get_next_number(n):
    # 先将数字转换成列表,便于修改和比较
    nums = list(str(n))
    length = len(nums)
    # 从后往前找,找到第一个比后面的数字小的数字
    for i in range(length-1, 0, -1):
        if nums[i] > nums[i-1]:
            # 对 i-1 后面的数字排序,找出比 i-1 大的最小数字
            nums[i:] = sorted(nums[i:])
            for j in range(i, length):
                if nums[j] > nums[i-1]:
                    # 交换 i-1 和 j
                    nums[i-1], nums[j] = nums[j], nums[i-1]
                    # 将 i-1 后面的数字排序,得到答案
                    nums[i:] = sorted(nums[i:])
                    answer = int(''.join(nums))
                    return answer
            break
    return -1

这个函数的时间复杂度为 O(n log n),其中 n 是数值的位数。具体来说,它先将数字转换成列表(时间复杂度为 O(n)),然后从后往前找第一个比后面数字小的数字(时间复杂度为 O(n)),接着对 i-1 后面的数字进行排序,找出比 i-1 大的最小数字(时间复杂度为 O(n log n)),最后交换 i-1 和 j,将 i-1 后面的数字排序,得到答案(时间复杂度为 O(n log n))。因此,总的时间复杂度为 O(n log n)。

下面是一些测试样例:

assert get_next_number(123) == 132
assert get_next_number(129) == 192
assert get_next_number(9876543210) == -1
assert get_next_number(9876502341) == 9876502413
assert get_next_number(54321) == -1

这个实现可以处理数字较大的情况,因为它仅仅将数字转换成了列表,而没有使用任何数值类型的特性。但是,由于它使用了列表的高级方法,可能不太容易理解。如果想要更简单易懂的实现,可以考虑将数字转换成字符串,对字符串进行操作,最后再将它转换回数字。