【发布时间】:2020-11-18 03:48:58
【问题描述】:
创建一个函数,它接受一个正整数并返回下一个更大的数字,该数字可以通过重新排列其数字来形成。
为此,我使用了以下代码:
使用的逻辑:
- 编写一个脚本来完成数字的所有排列,例如123 -> 132,321,231,...
- 从可能的组合中选择最大的数
- 如果该数字大于原始数字,则返回该数字 - 如果不是,则返回 -1。
代码块:
import itertools
def next_bigger(n):
# [int(x) for x in str(n)] ex: convert 123 to array [1,2,3]
# list(set(itertools.permutations... gives you a list of permutation e.g. [[1,3,2],[3,2,1],[2,3,1],...]
# [int(''.join(map(str,x))) for x in ... converts each permuted list into a number e.g. convert [2,3,1] -> 231
# for num in sorted(...if num>n: --> if 321 is bigger than 123, return it
for num in sorted([int(''.join(map(str,x))) for x in list(set(itertools.permutations([int(x) for x in str(n)])))]):
if num>n:
return num
else:
return -1
预期输出:
nextBigger(num: 12) // returns 21
nextBigger(num: 513) // returns 531
nextBigger(num: 2017) // returns 2071
nextBigger(num: 9) // returns nil
nextBigger(num: 111) // returns nil
nextBigger(num: 531) // returns nil
实际输出:Test results fail
解决方案尝试#2:
import itertools
def next_bigger(n):
# [int(x) for x in str(n)] ex: convert 123 to array [1,2,3]
# list(set(itertools.permutations... gives you a list of permutation e.g. [[1,3,2],[3,2,1],[2,3,1],...]
# [int(''.join(map(str,x))) for x in ... converts each permuted list into a number e.g. convert [2,3,1] -> 231
# for num in sorted(...if num>n: --> if 321 is bigger than 123, return it
a = []
results = 0
for num in sorted([int(''.join(map(str,x))) for x in list(set(itertools.permutations([int(x) for x in str(n)])))]):
if num>n:
a.append(num)
results = a[0]
return results
预期输出:通过除长数字以外的所有测试用例
我的代码有什么问题?
【问题讨论】:
-
我们正在寻找下一个更大的排列,而不是最大排列。 (另外,遍历每一个排列非常慢。)
-
那么最好的方法是什么?逻辑选择大于输入数字的数字
-
有人应该对我进行理智检查,但似乎要使用的算法是取最低有效数字,将其与第一个较小的有效数字交换,然后对低于该数字的所有数字进行排序观点。因此,对于
98176543,您将从3开始,将其与1(左侧第一个较小的数字)交换以得到98376541,然后将所有数字排序到新3位置的右侧,得到98314567作为下一个更大的排列。就像我说的那样,这是第一个想法,而且已经晚了,所以我可能犯了一个基本的错误。如果它有效,它会比你的方法快得多。 -
在检查时,它需要一些工作(如果最低有效位小于所有其他数字,则使用第二个最低有效位重试,依此类推)。
标签: python python-3.x permutation