📅  最后修改于: 2023-12-03 15:10:05.306000             🧑  作者: Mango
给定一个正整数 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