问题描述
小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)
代码思路解释
- 初始化结果列表:
result = []
创建一个空列表 result,用于存储最终的字符串片段。
- 遍历盘子序号列表:
i = 0
while i < len(plates):
使用一个 while 循环来遍历 plates 列表。变量 i 用于跟踪当前处理的盘子序号的索引。
- 找到连续序列的起始点:
start = i
记录当前连续序列的起始索引 start。
- 查找连续序列的结束点:
while i + 1 < len(plates) and plates[i + 1] == plates[i] + 1:
i += 1
使用一个内部 while 循环来查找当前连续序列的结束点。如果下一个盘子序号是当前盘子序号加1,则继续移动 i,直到不再连续为止。
- 处理连续序列:
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列表中。
- 如果连续序列的长度大于等于3(即
- 移动到下一个序列的起始点:
i += 1
将 i 增加1,以便开始处理下一个可能的连续序列。
- 生成最终结果字符串:
return ",".join(result)
使用 ",".join(result) 将 result 列表中的所有字符串片段连接成一个完整的字符串,并返回。
总结
通过上述步骤,我们能够有效地找到所有连续的盘子序号序列,并根据题目要求将它们格式化为所需的字符串形式。这种方法的时间复杂度为 O(n),其中 n 是 plates 列表的长度,因为每个元素最多只会被访问一次。空间复杂度为 O(n),因为 result 列表在最坏情况下可能包含所有盘子序号。
豆包MarsCode刷题总结
在 MarsCode 刷题期间,收获满满。刷题涵盖多种类型,数量可观。
遇到不少困难,如算法理解难,通过重学理论、借助示例演示等攻克;代码实现易出错,便巩固语法、逐步细化编写并处理好边界条件;时间复杂度优化难,就学习分析方法、运用高效算法改进。
通过刷题,深化了算法与数据结构知识,能依实际情况灵活选用。编程技能也显著提升,代码规范性、调试能力都更强。同时,培养了耐心与解决问题的思维,为后续学习与实践打下坚实基础。