📌  相关文章
📜  找出最接近 N 且最多有一位非零数字的较大数字(1)

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

找出最接近 N 且最多有一位非零数字的较大数字

题目描述

给定一个正整数 N,找到一个比 N 大且最多有一位非零数字的整数 M。如果存在多个 M 满足条件,返回最小的那个 M。

例如:输入 N = 332,输出 340;输入 N = 105,输出 110。

思路

从 N + 1 开始,逐个判断是否满足条件,直到找到第一个符合条件的数,即为所求答案。

判断一个数是否满足条件的方法是:将其每一位数取出来进行判断。当某一位不为0且没有被访问过时,将其抹去并在其后面添加一个0,得到一个新的数。比较这个新数与 N 的大小关系,若新数大于 N,则满足条件。

若一个数的每一位数都被访问过了,还没有找到符合条件的数,则没有解。

代码实现

Python 代码实现如下:

def find_number(n: int) -> int:
    visited = [False] * 10  # 记录每个数字是否被访问过
    s = str(n)
    digit = [int(x) for x in s]  # 把数字拆分成每一位
    for i in range(n+1, 10*n):
        tmp = i
        flag = False  # 是否符合条件的标志位
        while tmp:
            k = tmp % 10
            if k == 0:
                tmp //= 10
                continue
            if visited[k]:
                flag = False
                break
            visited[k] = True
            tmp //= 10
            if tmp == 0:  # 已经处理完最低位
                if i > n:
                    return i
                else:
                    flag = False
                    break
            if tmp * 10 > n:  # 当前处理的数字已经比 N 大了
                flag = True
                break
        # 重置 visited 数组
        for j in digit:
            visited[j] = False
        if flag:
            return i
    return -1
示例运行
>>> find_number(332)
340
>>> find_number(105)
110
>>> find_number(999)
1000
>>> find_number(1098765432)
1200000000