题目解析
题目描述
小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 都应单独列出。
解题思路
-
初始化:
result列表用于存储处理后的结果字符串。current_sequence列表用于存储当前正在处理的连续数字序列。
-
遍历输入数组:
-
遍历
plates列表中的每一个元素。 -
对于每一个元素,判断它是否可以加入到
current_sequence中:- 如果
current_sequence为空,或者当前元素是current_sequence中最后一个元素的下一个连续数字(即plates[i] == current_sequence[-1] + 1),则将其加入到current_sequence中。 - 否则,说明当前元素无法继续当前序列,需要处理
current_sequence并重置。
- 如果
-
-
处理当前序列:
- 如果
current_sequence的长度大于等于 3,说明这是一个足够长的连续序列,将其表示为 "起始数字-结束数字" 的形式,并添加到result中。 - 否则,说明
current_sequence长度小于 3,将其中的数字逐个转换为字符串并添加到result中。 - 重置
current_sequence为当前元素,开始处理新的序列。
- 如果
-
处理最后一个序列:
- 遍历完成后,需要检查并处理
current_sequence,因为最后一个序列可能没有被处理。 - 处理方式与上述步骤相同。
- 遍历完成后,需要检查并处理
-
返回结果:
- 将
result列表中的字符串以逗号分隔的形式连接成一个字符串,并返回。
- 将
图解示例
假设输入为 plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20] 和 n = 10:
-
初始化
result = []和current_sequence = []。 -
遍历
plates:-3:current_sequence = [-3]-2:current_sequence = [-3, -2]-1:current_sequence = [-3, -2, -1]2:处理current_sequence,得到result = ["-3--1"],current_sequence = [2]10:current_sequence = [2, 10](无法形成连续序列,直接添加)15:current_sequence = [15]16:current_sequence = [15, 16]18:处理current_sequence,得到result = ["-3--1", "2", "10", "15-16"],current_sequence = [18]19:current_sequence = [18, 19]20:current_sequence = [18, 19, 20]
-
处理最后一个序列:
result = ["-3--1", "2", "10", "15-16", "18-20"] -
返回结果字符串
"-3--1,2,10,15-16,18-20"。
代码详解
1. 函数定义与初始化
python复制代码
def solution(plates: list[int], n: int) -> str:
# 初始化结果列表和当前序列
result = []
current_sequence = []
solution函数接收两个参数:一个整数列表plates和一个整数n。result列表用于存储处理后的结果字符串。current_sequence列表用于存储当前正在处理的连续数字序列。
2. 遍历输入数组
python复制代码
# 遍历输入数组
for i in range(n):
- 使用
for循环遍历plates列表中的每一个元素,索引i从 0 到n-1。
3. 判断并处理当前元素
python复制代码
# 如果当前序列是空的,或者当前元素是当前序列的下一个连续元素
if not current_sequence or plates[i] == current_sequence[-1] + 1:
current_sequence.append(plates[i])
else:
# 处理当前序列
if len(current_sequence) >= 3:
result.append(f"{current_sequence[0]}-{current_sequence[-1]}")
else:
result.extend(map(str, current_sequence))
# 重置当前序列为当前元素
current_sequence = [plates[i]]
-
判断当前元素是否可以加入到
current_sequence中:- 如果
current_sequence为空,或者当前元素是current_sequence中最后一个元素的下一个连续数字,则将其加入到current_sequence中。
- 如果
-
否则,说明当前元素无法继续当前序列,需要处理
current_sequence:- 如果
current_sequence的长度大于等于 3,将其表示为 "起始数字-结束数字" 的形式,并添加到result中。 - 否则,将
current_sequence中的数字逐个转换为字符串并添加到result中。
- 如果
-
重置
current_sequence为当前元素,开始处理新的序列。
4. 处理最后一个序列
python复制代码
# 处理最后一个序列
if len(current_sequence) >= 3:
result.append(f"{current_sequence[0]}-{current_sequence[-1]}")
else:
result.extend(map(str, current_sequence))
- 遍历完成后,需要检查并处理
current_sequence,因为最后一个序列可能没有被处理。 - 处理方式与上述步骤相同:根据
current_sequence的长度,将其转换为相应的字符串形式并添加到result中。
5. 返回结果字符串
python复制代码
# 返回结果字符串
return ",".join(result)
- 将
result列表中的字符串以逗号分隔的形式连接成一个字符串,并返回。
6. 主函数与测试用例
python复制代码
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")
if __name__ == "__main__":语句确保以下代码仅在脚本作为主程序运行时执行。- 使用
print语句添加多个测试用例,验证solution函数的正确性。 - 每个测试用例将
solution函数的输出与预期结果进行比较,如果相等则打印True,否则打印False。
总结
本题主要考察了如何对连续的数字序列进行识别和处理,并将其转换为特定的字符串表示形式。通过遍历输入数组并使用辅助列表来跟踪当前序列,可以有效地解决这一问题。同时,需要注意处理边界情况,如最后一个序列的处理。