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

64 阅读3分钟

题目解析

问题描述

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

测试样例

  1. 输入:plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10 输出:"-3--1,2,10,15,16,18-20" 解释:连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。

  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"

思路

  1. 理解问题:我们需要将盘子的序号按照连续递增且至少包含3个盘子的规则进行分组。
  2. 遍历数组
    • 使用两个指针 startend 来标记当前连续递增序列的起点和终点。
    • 如果当前序列的长度小于3,则将每个盘子单独列出。
    • 如果当前序列的长度大于等于3,则将整个序列作为一个分组。
  3. 构建结果字符串
    • 对于每个分组,如果是单个盘子或两个盘子,直接添加到结果字符串中。
    • 如果是三个或更多盘子,使用 start--end 的格式添加到结果字符串中。
  4. 返回结果:将所有分组连接成一个字符串,并用逗号分隔。

代码详解

def solution(plates: list[int], n: int) -> str:
    if not plates:
        return ""
    
    result = []
    start = 0  # 当前连续递增序列的起点
    
    for i in range(1, n):
        # 如果当前盘子与前一个盘子不连续,处理当前序列
        if plates[i] != plates[i - 1] + 1:
            if i - start >= 3:
                result.append(f"{plates[start]}-{plates[i - 1]}")
            else:
                result.extend(map(str, plates[start:i]))
            start = i  # 更新起点
    
    # 处理最后一个序列
    if n - start >= 3:
        result.append(f"{plates[start]}-{plates[-1]}")
    else:
        result.extend(map(str, plates[start:n]))
    
    return ",".join(result)

if __name__ == "__main__":
    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. 连续递增序列
    • 使用两个指针 startend 来标记当前连续递增序列的起点和终点。
  2. 字符串构建
    • 使用 f-stringmap 函数来构建结果字符串。
  3. 列表操作
    • 使用 extend 方法将多个元素添加到列表中。

自己的理解

  • 连续递增序列:通过遍历数组,使用两个指针来标记当前连续递增序列的起点和终点,可以高效地找到所有符合要求的序列。
  • 字符串构建:使用 f-stringmap 函数可以方便地将多个元素转换为字符串并添加到结果列表中。
  • 列表操作:使用 extend 方法可以将多个元素一次性添加到列表中,避免多次调用 append 方法。