题目
代码实现
def solution(plates: list[int], n: int) -> str:
# Please write your code here
if n == 0:
return ""
result = []
start = 0 # 当前连续序列的起始位置
for i in range(1, n):
# 检查当前盘子是否与前一个盘子连续
if plates[i] != plates[i - 1] + 1:
# 如果当前连续序列的长度大于等于3
if i - start >= 3:
result.append(f"{plates[start]}-{plates[i - 1]}")
else:
for j in range(start, i):
result.append(str(plates[j]))
start = i # 更新新的连续序列的起始位置
# 处理最后一个序列
if n - start >= 3:
result.append(f"{plates[start]}-{plates[n - 1]}")
else:
for j in range(start, n):
result.append(str(plates[j]))
return ",".join(result)
if __name__ == "__main__":
# You can add more test cases here
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")
问题描述
小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序摆放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。不满足连续递增至少3个的盘子序号需要单独列出。需要编写程序帮助小M确定盘子的叠放方式。
解决方案
为了帮助小M确定盘子的叠放方式,我们可以使用以下步骤:
-
初始化变量:
result:用于存储最终结果的列表。start:当前连续序列的起始位置。
-
遍历盘子序号:
-
使用一个循环从第二个盘子开始遍历。
-
检查当前盘子是否与前一个盘子连续。
-
如果不连续:
- 检查当前连续序列的长度是否大于等于3。
- 如果是,将其添加到结果列表中,格式为
start-end。 - 如果不是,将该序列中的每个盘子单独添加到结果列表中。
- 更新
start为当前盘子的位置。
-
-
处理最后一个序列:
- 检查最后一个序列的长度是否大于等于3。
- 如果是,将其添加到结果列表中,格式为
start-end。 - 如果不是,将该序列中的每个盘子单独添加到结果列表中。
-
返回结果:
- 将结果列表中的字符串用逗号连接起来,返回最终结果。
代码解释
-
初始化变量:
result = []:用于存储最终结果的列表。start = 0:当前连续序列的起始位置。
-
遍历盘子序号:
for i in range(1, n):从第二个盘子开始遍历。if plates[i] != plates[i - 1] + 1:检查当前盘子是否与前一个盘子连续。if i - start >= 3:如果当前连续序列的长度大于等于3,将其添加到结果列表中,格式为start-end。- 否则,将该序列中的每个盘子单独添加到结果列表中。
start = i:更新新的连续序列的起始位置。
-
处理最后一个序列:
if n - start >= 3:检查最后一个序列的长度是否大于等于3,如果是,将其添加到结果列表中,格式为start-end。- 否则,将该序列中的每个盘子单独添加到结果列表中。
-
返回结果:
return ",".join(result):将结果列表中的字符串用逗号连接起来,返回最终结果。
总结与反思
通过上述方法,我们能够高效地确定盘子的叠放方式。这种方法的时间复杂度为 O(n),其中 n 是盘子的总数。通过遍历盘子序号并记录连续序列的起始位置,我们能够快速识别出符合条件的连续序列,并将其正确地表示出来。