You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术问询:如何将连续数字替换为数字范围,同时保留随机数字

处理数字序列:将连续数字转为范围格式,保留非连续数字

这问题我之前做数据整理时经常碰到,核心思路就是遍历数字序列,跟踪当前连续区间的起始和结束值,遇到断档就把当前区间按规则输出(单个数字直接保留,连续区间转成x-y格式),然后重置起始值继续处理后面的数字。

核心逻辑拆解

  • 先把输入的字符串分割成整数列表(其他语言思路一致,只是语法差异)
  • 用两个变量startend记录当前连续区间的首尾数字
  • 遍历每个后续数字:
    • 如果当前数字是end + 1,说明属于同一连续区间,更新end
    • 如果不连续,就把当前区间加入结果列表,然后重置startend为当前数字
  • 遍历结束后,别忘了把最后一个区间也加入结果

Python代码实现(支持有序/无序输入)

下面是我常用的实现,还加了可选的排序参数——如果你的输入数字是无序的,开启排序后能正确识别分散的连续数字:

def format_number_sequence(input_str, sort_first=False):
    # 分割输入字符串并转换为整数列表
    nums = list(map(int, input_str.split(',')))
    if not nums:
        return ""
    
    # 可选:先对数字排序,处理无序输入的情况
    if sort_first:
        nums.sort()
    
    result = []
    start = end = nums[0]
    
    for num in nums[1:]:
        # 判断是否属于当前连续区间
        if num == end + 1:
            end = num
        else:
            # 处理当前区间:单个数字直接转字符串,连续区间转x-y格式
            if start == end:
                result.append(str(start))
            else:
                result.append(f"{start}-{end}")
            # 重置区间首尾为当前数字
            start = end = num
    
    # 处理最后一个未加入结果的区间
    if start == end:
        result.append(str(start))
    else:
        result.append(f"{start}-{end}")
    
    return ','.join(result)

测试示例

  1. 有序输入(和你的例子一致):
    print(format_number_sequence("1,2,3,4,5,6,458,243"))
    # 输出:1-6,458,243
    
  2. 无序输入(开启排序):
    print(format_number_sequence("3,1,2,5,458,243", sort_first=True))
    # 输出:1-3,5,243,458
    
  3. 边界情况测试:
    • 单个数字:format_number_sequence("123") → 输出123
    • 全连续数字:format_number_sequence("7,8,9,10") → 输出7-10
    • 全非连续数字:format_number_sequence("5,10,15") → 输出5,10,15

其他语言思路

如果用JavaScript、Java等语言,逻辑完全一致:

  1. 分割字符串转数字数组
  2. 初始化区间首尾变量
  3. 遍历数组判断连续性
  4. 拼接结果字符串

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

火山引擎 最新活动