问题描述
小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都应单独列出.
代码结构
-
函数定义:
def solution(plates: list[int], n: int) -> str:plates是一个整数列表,表示盘子的序号。n是盘子的总数。- 函数返回一个字符串,表示盘子的叠放方式。
-
初始化变量:
result = [] start = plates[0] end = plates[0]
result是一个列表,用于存储最终的结果字符串。start和end分别表示当前连续序列的起始和结束盘子序号。
- 遍历盘子列表:
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中。
- 如果当前连续序列的长度大于等于3(即
-
更新
start和end为当前盘子。
- 处理最后一个连续序列:
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中。
- 如果长度大于等于3,将其格式化为
- 返回结果:
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函数,确保其输出符合预期。
总结
- 该代码通过遍历盘子列表,识别连续的盘子序列,并根据序列的长度将其格式化为不同的字符串形式。
- 最终将所有结果用逗号连接,返回一个字符串。