如何生成最大长度为n、所有数位严格递减的数字?
实现思路
所有数位严格递减的数字,本质是从0-9共10个数字中选k个不同数字(k取值范围为1到n),再按从大到小排序拼接而成,天然不会出现重复、数位相等的情况,覆盖所有符合要求的结果。
现有代码问题排查
- 语法错误:
func函数内部代码没有缩进,Python对缩进要求严格,会直接触发运行报错 - 逻辑覆盖不全:初始
arr仅存入了3位严格递减数,后续生成逻辑也仅在已有数字后拼接更小的数位,没有覆盖1位、2位的独立结果;循环终止条件k>1会漏掉末尾加1的情况,比如541这类结果无法生成 - 计算错误:求百位、十位时用了普通除法
/,Python3中/返回浮点数,后续取模运算会出现异常,应该用整数除法// - 输出格式错误:直接调用
write没有加换行符,生成的内容会全部连在一起,无法识别单个数字
正确实现代码
基于组合库的简洁实现
from itertools import combinations def generate_strict_decreasing(n, output_path="demo.txt"): res = [] # 遍历所有可能的数字长度,从1到最大长度n for length in range(1, n+1): # 从0-9中选length个不同数字,combinations返回升序元组 for digits in combinations(range(10), length): # 跳过前导为0的无效数字 if digits[-1] == 0: continue # 反转元组得到降序排列,拼接为字符串 num_str = ''.join(map(str, reversed(digits))) res.append(num_str) # 写入文件,每行一个结果 with open(output_path, 'w', encoding='utf-8') as f: f.write('\n'.join(res)) return res # 调用示例:生成最大长度为5的符合要求的数字 generate_strict_decreasing(5)
无第三方依赖的回溯实现
def backtrack(start, path, n, res): if path: res.append(''.join(map(str, path))) if len(path) == n: return # 下一位必须比当前最后一位小,从start-1向下遍历到0 for num in range(start-1, -1, -1): path.append(num) backtrack(num, path, n, res) path.pop() def generate_strict_decreasing(n, output_path="demo.txt"): res = [] # 第一位从9到1,不能为0 for first in range(9, 0, -1): backtrack(first, [first], n, res) with open(output_path, 'w', encoding='utf-8') as f: f.write('\n'.join(res)) return res generate_strict_decreasing(5)
内容的提问来源于stack exchange,提问作者Yankee
相关产品推荐
相关产品推荐

