生成无重复且无连续递增数字的唯一四位数编码列表
生成符合规则的数字编码(支持扩展至多位)
需求明确
我需要生成一组用作编码的数字,核心规则如下:
- 基础目标:四位数编码,数字完全不重复,且后一位数字不能是前一位的连续递增(即
后一位 ≠ 前一位 + 1) - 特殊允许:反转数字可共存(比如
1357和7531都保留) - 扩展需求:可以扩展生成五位数、六位数等更长编码
下面是我实现的函数,同时分享递归扩展的思路,欢迎大家提出改进建议。
四位数编码实现(迭代过滤版)
def generate_four_digit_codes(): valid_codes = [] # 遍历所有无重复数字的四位数排列 from itertools import permutations for digits in permutations('0123456789', 4): code = ''.join(digits) # 跳过前导零的编码(如果业务允许前导零可移除这行) if code.startswith('0'): continue # 检查是否存在连续递增的相邻位 invalid = False for i in range(3): if int(digits[i+1]) == int(digits[i]) + 1: invalid = True break if not invalid: valid_codes.append(code) return valid_codes # 使用示例 codes = generate_four_digit_codes() print(f"符合规则的四位数编码总数:{len(codes)}")
递归扩展实现(支持任意长度)
为了适配更长位数的编码生成,递归方案可以在构建过程中直接过滤不符合规则的情况,避免生成所有排列再筛选,效率更高:
def build_valid_codes(length, current=[], used=set(), result=None): if result is None: result = [] if len(current) == length: result.append(''.join(current)) return for num in '0123456789': # 跳过已使用的数字 if num in used: continue # 跳过前导零(如果不允许的话) if not current and num == '0': continue # 跳过连续递增的情况 if current and int(num) == int(current[-1]) + 1: continue # 递归构建 build_valid_codes(length, current + [num], used | {num}, result) return result # 生成五位数编码示例 five_digit_codes = build_valid_codes(5) print(f"符合规则的五位数编码总数:{len(five_digit_codes)}")
待改进方向征集
目前的实现满足基础需求,但还有优化空间:
- 性能:针对8位及以上的长编码,递归或排列过滤的效率可能下降,有没有更高效的剪枝策略或数学计算方式?
- 扩展性:如果后续要添加新规则(比如禁止连续递减、排除特定数字),怎么让函数更灵活?
- 内存:当生成大量编码时,能否实现按需生成(迭代器模式),而不是一次性存储所有结果?
内容的提问来源于stack exchange,提问作者DanimalReks
相关产品推荐
相关产品推荐

