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

87 阅读3分钟

问题描述

小M有一个独特的方式来收拾家中的盘子。 每次用餐后,他会将盘子按照他们的序号顺序叠放。 盘子的序号都是唯一的整数,并且在收拾前就是递增的。 小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。 需要编写程序帮助小M确定盘子的叠放方式。 例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15,16, 18, 19, 20],按照小M的规则,连续递增序列 -3,-2,-1可以叠在一起表示为-3--1,而 18, 19,20 可以叠在一起表示为 1820。 不满足连续递增至少3个的,如 2,10, 15,16都应单独列出.

代码结构

  1. 函数定义

    def solution(plates: list[int], n: int) -> str:

    • plates 是一个整数列表,表示盘子的序号。
    • n 是盘子的总数。
    • 函数返回一个字符串,表示盘子的叠放方式。
  2. 初始化变量

result = [] start = plates[0] end = plates[0]

  • result 是一个列表,用于存储最终的结果字符串。
  • start 和 end 分别表示当前连续序列的起始和结束盘子序号。
  1. 遍历盘子列表

for i in range(1, n): if plates[i] == end + 1: end = plates[i] else: if end - start >= 2: result.append(f"{start}-{end}") else: for num in range(start, end + 1): result.append(str(num)) start = plates[i] end = plates[i]

  • 使用 for 循环遍历盘子列表,从第二个盘子开始(索引为1)。

  • 如果当前盘子 plates[i] 与前一个盘子 end 连续(即 plates[i] == end + 1),则更新 end

  • 如果当前盘子不连续,处理当前连续序列:

    • 如果当前连续序列的长度大于等于3(即 end - start >= 2),将其格式化为 start-end 的形式,并添加到 result 中。
    • 如果当前连续序列的长度小于3,将其逐个添加到 result 中。
  • 更新 start 和 end 为当前盘子。

  1. 处理最后一个连续序列

if end - start >= 2: result.append(f"{start}-{end}") else: for num in range(start, end + 1): result.append(str(num))

  • 在循环结束后,检查最后一个连续序列:

    • 如果长度大于等于3,将其格式化为 start-end 的形式,并添加到 result 中。
    • 如果长度小于3,将其逐个添加到 result 中。
  1. 返回结果

return ",".join(result)

  • 将 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")

  • 这部分代码用于测试 solution 函数,确保其输出符合预期。

总结

  • 该代码通过遍历盘子列表,识别连续的盘子序列,并根据序列的长度将其格式化为不同的字符串形式。
  • 最终将所有结果用逗号连接,返回一个字符串。