叠盘子排序
问题描述
小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序叠放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。需要编写程序帮助小M确定盘子的叠放方式。
例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。
输入参数
plates: 一个整数数组,表示盘子的序号n: 盘子总数
测试样例
样例1:
输入:
plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10输出:"-3--1,2,10,15,16,18-20"
样例2:
输入:
plates = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], n = 20输出:"-6,-3-1,3-5,7-11,14,15,17-20"
样例3:
输入:
plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8输出:"1,2,7-11,19"
题解
- 遍历数组:从第一个盘子开始,遍历整个数组。
- 寻找连续序列:检查当前盘子是否与前一个盘子连续。如果是,继续检查下一个盘子,直到不再连续。
- 判断序列长度:如果连续序列的长度大于等于3,将其作为一个连续区间;否则,将每个单独的盘子作为一个区间。
- 格式化输出:将连续区间格式化为
start-end,将单独的盘子格式化为plate。
好的,我来总结一下解题思路:
问题理解
小M需要将盘子按照序号顺序叠放,并且每一堆盘子的序号必须是连续递增的,且至少包含3个盘子。如果连续递增的盘子数量不足3个,则需要单独列出每个盘子。
数据结构选择
- 数组:用于存储盘子的序号。
- 列表:用于存储最终的叠放结果。
算法步骤
- 遍历数组:从第一个盘子开始,遍历整个数组。
- 寻找连续序列:检查当前盘子是否与前一个盘子连续。如果是,继续检查下一个盘子,直到不再连续。
- 判断序列长度:如果连续序列的长度大于等于3,将其作为一个连续区间;否则,将每个单独的盘子作为一个区间。
- 格式化输出:将连续区间格式化为
start-end,将单独的盘子格式化为plate。
具体步骤
- 初始化:创建一个空列表
result用于存储最终结果,初始化索引i为0。 - 遍历数组:使用
while循环遍历数组。 - 寻找连续序列:在内部使用
while循环检查当前盘子是否与下一个盘子连续,直到不再连续。 - 判断序列长度:根据连续序列的长度决定是将其格式化为连续区间还是单独列出每个盘子。
- 格式化输出:使用
join方法将结果列表转换为字符串。
通过遍历数组并寻找连续序列,我们可以有效地将盘子按照小M的规则叠放。关键在于判断连续序列的长度,并根据长度决定如何格式化输出。最终,我们将结果列表转换为字符串,得到最终的叠放方式。
def solution(plates: list[int], n: int) -> str:
result = []
i = 0
while i < n:
start = i
# 找到连续序列的结束位置
while i + 1 < n and plates[i + 1] == plates[i] + 1:
i += 1
# 判断序列长度
if i - start + 1 >= 3:
# 格式化连续区间
result.append(f"{plates[start]}-{plates[i]}")
else:
# 单独列出每个盘子
for j in range(start, i + 1):
result.append(f"{plates[j]}")
i += 1
# 将结果列表转换为字符串
return ",".join(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")
相关知识点(以下由豆包生成)
- 数组遍历
- 问题:需要遍历整个盘子序号的数组,以检查每个盘子的序号。
- 知识点:使用循环(如
for或while循环)遍历数组,获取每个元素的值。
- 连续序列的检测
- 问题:需要检测数组中是否存在连续递增的序列。
- 知识点:通过比较当前元素与下一个元素的值,判断它们是否连续。可以使用嵌套循环或单个循环结合条件判断来实现。
- 条件判断
- 问题:需要根据连续序列的长度来决定如何处理这些序列。
- 知识点:使用条件语句(如
if-else)来判断连续序列的长度是否满足要求(至少3个),并根据判断结果执行不同的操作。
- 字符串格式化
- 问题:需要将连续序列和单独的盘子序号格式化为特定的字符串形式。
- 知识点:使用字符串格式化方法(如
f-string或str.format())将数字转换为字符串,并按照要求格式化输出。
- 列表操作
- 问题:需要将处理后的结果存储在一个列表中,并最终将列表转换为字符串。
- 知识点:使用列表来存储中间结果,并使用
join方法将列表中的元素连接成一个字符串。
- 边界条件处理
- 问题:需要处理数组的边界条件,如数组的开始和结束位置。
- 知识点:在遍历数组时,注意处理数组的边界条件,确保不会越界访问数组元素。