You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从数字范围生成最少数量的数字掩码?

生成最小数量数字掩码覆盖指定范围的Python实现方案

你需要的是把连续数字范围转换成最少数量的掩码(用*替代末尾连续数字),比如1000-1999直接用1***而非拆成多个细分掩码。这个需求的核心是找到最长的可覆盖前缀,让单个掩码覆盖尽可能大的连续区间,避免不必要的拆分。

实现思路

核心逻辑是递归拆分区间,优先用最大粒度的掩码覆盖:

  1. 先把数字转成固定长度的字符串,方便逐位对比公共前缀
  2. 对当前处理的子区间,先找起始和结束数字的最长公共前缀
  3. 检查从公共前缀之后的位置开始,是否能用单个掩码覆盖整个子区间——也就是起始数的后缀全为0,结束数的后缀全为9(比如1400000-1499999,就可以用14*****)
  4. 如果无法用单个掩码覆盖,就把区间拆成两部分:一部分是从起始数到「前缀+全9」,另一部分是「前缀+下一位+全0」到结束数,递归处理这两个子区间

Python代码实现

def generate_min_masks(start, end):
    # 统一数字的字符串长度,避免位数不一致的问题
    num_length = len(str(start))
    masks = []

    def process_interval(current_start, current_end):
        if current_start > current_end:
            return
        
        # 转成固定长度的字符串,补前导0(适配带前导零的数字场景)
        start_str = str(current_start).zfill(num_length)
        end_str = str(current_end).zfill(num_length)

        # 找到起始和结束数字的最长公共前缀长度
        common_prefix_len = 0
        while common_prefix_len < num_length and start_str[common_prefix_len] == end_str[common_prefix_len]:
            common_prefix_len += 1

        # 尝试找最长的可覆盖掩码:从公共前缀之后的位置开始,检查是否可以用*覆盖后缀
        for suffix_start in range(common_prefix_len, num_length):
            start_suffix = start_str[suffix_start:]
            end_suffix = end_str[suffix_start:]
            # 如果起始后缀全0,结束后缀全9,说明这个区间可以用一个掩码覆盖
            if start_suffix == '0' * (num_length - suffix_start) and end_suffix == '9' * (num_length - suffix_start):
                masks.append(f"{start_str[:suffix_start]}{'*'*(num_length - suffix_start)}")
                return
        
        # 无法用单个掩码覆盖,拆分区间
        # 第一个区间:current_start 到 前缀+全9
        first_interval_end = int(start_str[:common_prefix_len] + '9'*(num_length - common_prefix_len))
        process_interval(current_start, first_interval_end)
        
        # 第二个区间:前缀+下一位+全0 到 current_end
        next_digit = str(int(start_str[common_prefix_len]) + 1)
        second_interval_start = int(start_str[:common_prefix_len] + next_digit + '0'*(num_length - common_prefix_len - 1))
        process_interval(second_interval_start, current_end)

    process_interval(start, end)
    return masks

# 测试示例:覆盖1323000-1555999
if __name__ == "__main__":
    start_num = 1323000
    end_num = 1555999
    mask_list = generate_min_masks(start_num, end_num)
    
    print("生成的最小掩码列表:")
    for mask in mask_list:
        print(mask)

代码说明

  • zfill(num_length)确保数字转成字符串后长度一致,避免处理不同位数数字时出错
  • 递归函数process_interval负责处理每个子区间,优先尝试用单个掩码覆盖,不行再拆分
  • 拆分区间时,把当前区间分成「到前缀全9」和「前缀下一位全0开始」两个部分,确保不会有数字遗漏

测试验证

比如输入范围1000-1999,调用generate_min_masks(1000, 1999)会直接返回['1***'],完全符合需求;而你给出的1323000-1555999范围,会生成你示例中的掩码列表,没有多余拆分。

内容的提问来源于stack exchange,提问作者tvn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:30:19