叠盘子排序 | 豆包MarsCode AI刷题

136 阅读3分钟

问题描述

小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序叠放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。需要编写程序帮助小M确定盘子的叠放方式。

例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。

输入参数

  • plates: 一个整数数组,表示盘子的序号
  • n: 盘子总数

测试样例

样例1:

输入:plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10
输出:"-3--1,2,10,15,16,18-20"

样例2:

输入:plates = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], n = 20
输出:"-6,-3-1,3-5,7-11,14,15,17-20"

样例3:

输入:plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8
输出:"1,2,7-11,19"

为了帮助小M确定盘子的叠放方式,我们可以编写一个 Python 程序来实现这个功能。程序的主要思路是遍历输入的盘子序号列表,检查每个盘子序号是否可以与前一个序号形成连续递增的序列,并根据规则进行相应的处理。

以下是实现这个功能的代码:

def solution(plates, n):
    if n == 0:
        return ""
    
    result = []
    start = plates[0]
    count = 1
    
    for i in range(1, n):
        if plates[i] == plates[i - 1] + 1:
            count += 1
        else:
            if count >= 3:
                result.append(f"{start}-{plates[i - 1]}")
            else:
                result.extend(map(str, plates[i - count:i]))
            start = plates[i]
            count = 1
    
    # 处理最后一段
    if count >= 3:
        result.append(f"{start}-{plates[-1]}")
    else:
        result.extend(map(str, plates[n - count:n]))
    
    return ",".join(result)

# 测试样例
print(solution([-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], 10))  # 输出:"-3--1,2,10,15,16,18-20"
print(solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], 20))  # 输出:"-6,-3-1,3-5,7-11,14,15,17-20"
print(solution([1, 2, 7, 8, 9, 10, 11, 19], 8))  # 输出:"1,2,7-11,19"

代码解释

  1. 初始化
  • result 用于存储最终的结果字符串。
  • start 用于记录当前连续递增序列的起始位置。
  • count 用于记录当前连续递增序列的长度。
  1. 遍历盘子序号
  • 从第二个盘子开始遍历(索引从 1 开始)。
  • 检查当前盘子序号是否与前一个盘子序号连续递增。
  • 如果连续递增,增加 count
  • 如果不连续递增,根据 count 的值决定如何处理当前的连续序列:
    • 如果 count 大于等于 3,将连续序列以 start-plates[i-1] 的形式加入 result
    • 如果 count 小于 3,将当前的连续序列中的每个盘子序号单独加入 result
  • 更新 start 为当前盘子序号,重置 count 为 1。
  1. 处理最后一段
  • 循环结束后,处理最后一段连续序列,逻辑与上述相同。
  1. 返回结果
  • 将 result 列表中的字符串用逗号连接成一个字符串并返回。