输入是一个由n位组成的数字,你需要找到前一个数字相同的数字,例如:12354 - 12345, 21 - 12, 511 - 151。如果找不到,输出-1 ,例如:9 - (-1), 222 - (-1), 500 - (-1)因为零是微不足道的,这与条件相矛盾。
import itertools as iter
def next_smaller(number):
digits = [digit for digit in str(number)]
all, l = list(iter.permutations(digits)), -1
for i in range(len(all)):
if int(''.join(all[i])) < number and ''.join(all[i]).startswith('0') != True:
l = int(''.join(all[i])) if int(''.join(all[i])) > l else l
return l
此选项有效,但需要更快
def next_smaller(number):
l = -1
for numberr in range(number - 1):
if sorted([digit for digit in str(number - numberr)]) == sorted([digit for digit in str(number)]):
if numberr < number and str(number - numberr).startswith('0') != True:
l = number - numberr if number - numberr > l else l
return l
这通常会减慢 10 ^ 9 个数字
肯定会有很多数字,你需要找到其中最大的——也就是最接近原始数字的
据我了解,这就是对所有数字或其组合进行排序所需的时间,如 1 个示例所示,有助于简化代码。
从末尾开始搜索第一个数字,以使右侧至少少一个数字。然后它移动——比它小的最大的向右移动——到它的位置,其余的按降序排列。一个特殊的情况是一个数字,它的右边至少少一个数字,在数字中的第一位,并且小于它的所有数字都是零,那么没有解决方案,因为前导零是被禁止的。
如应用于splash58的评论中显示的数字-
92344762172133:右边第一个符合要求的数字是倒数第四个。它的右边是数字
1,3,3。它们中的最大值小于这两个 - 1。数字保持不变3,3 и 2。结果92344762171332。在没有我的情况下把它变成代码......我在“哦,它是什么?”上有一个 python。