每日一题:叠盘子排序(青训营X豆包MarsCode) | 豆包MarsCode AI 刷题

54 阅读3分钟

问题描述

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

输入

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

输出

  • 返回一个字符串,表示按照小M的规则叠放的盘子序号。

示例

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

代码实现及解释

def solution(plates: list[int], n: int) -> str:
    result = []
    i = 0
    while i < len(plates):
        start = i
        while i + 1 < len(plates) and plates[i + 1] == plates[i] + 1:
            i += 1
        if i - start >= 2:
            result.append(f"{plates[start]}-{plates[i]}")
        else:
            result.extend(str(plates[j]) for j in range(start, i + 1))
        i += 1
    return ",".join(result)

代码思路解释

  1. 初始化结果列表
result = []

创建一个空列表 result,用于存储最终的字符串片段。

  1. 遍历盘子序号列表
i = 0
while i < len(plates):

使用一个 while 循环来遍历 plates 列表。变量 i 用于跟踪当前处理的盘子序号的索引。

  1. 找到连续序列的起始点
start = i

记录当前连续序列的起始索引 start

  1. 查找连续序列的结束点
while i + 1 < len(plates) and plates[i + 1] == plates[i] + 1:
    i += 1

使用一个内部 while 循环来查找当前连续序列的结束点。如果下一个盘子序号是当前盘子序号加1,则继续移动 i,直到不再连续为止。

  1. 处理连续序列
if i - start >= 2:
    result.append(f"{plates[start]}-{plates[i]}")
else:
    result.extend(str(plates[j]) for j in range(start, i + 1))
    • 如果连续序列的长度大于等于3(即 i - start >= 2),则将该序列表示为范围形式(例如 -3--1),并将其添加到 result 列表中。
    • 否则,将该序列中的每个盘子序号单独添加到 result 列表中。
  1. 移动到下一个序列的起始点
i += 1

i 增加1,以便开始处理下一个可能的连续序列。

  1. 生成最终结果字符串
return ",".join(result)

使用 ",".join(result)result 列表中的所有字符串片段连接成一个完整的字符串,并返回。

总结

通过上述步骤,我们能够有效地找到所有连续的盘子序号序列,并根据题目要求将它们格式化为所需的字符串形式。这种方法的时间复杂度为 O(n),其中 n 是 plates 列表的长度,因为每个元素最多只会被访问一次。空间复杂度为 O(n),因为 result 列表在最坏情况下可能包含所有盘子序号。

豆包MarsCode刷题总结

在 MarsCode 刷题期间,收获满满。刷题涵盖多种类型,数量可观。

遇到不少困难,如算法理解难,通过重学理论、借助示例演示等攻克;代码实现易出错,便巩固语法、逐步细化编写并处理好边界条件;时间复杂度优化难,就学习分析方法、运用高效算法改进。

通过刷题,深化了算法与数据结构知识,能依实际情况灵活选用。编程技能也显著提升,代码规范性、调试能力都更强。同时,培养了耐心与解决问题的思维,为后续学习与实践打下坚实基础。