今天我们将在豆包MarsCode AI刷题平台上,完成《叠盘子排序》这个算法问题,通过练习提升用户解决此类问题的能力。
《叠盘子排序》题目如下:
问题理解
你需要将一个整数数组中的元素按照连续递增的规则进行分组。如果一组连续递增的元素数量大于等于3,则将它们表示为一个范围(例如 1-3);否则,将它们单独列出。
数据结构选择
- 使用一个列表来存储最终的结果。
- 使用两个指针
start和end来遍历数组,寻找连续递增的子序列。
算法步骤
-
初始化:
- 创建一个空列表
result用于存储最终的结果。 - 初始化指针
start为0,表示当前连续序列的起始位置。
- 创建一个空列表
-
遍历数组:
- 使用
end指针从start开始向后遍历,寻找连续递增的子序列。 - 如果
end指针指向的元素是start指针指向元素的连续递增元素,则继续移动end指针。
- 使用
-
处理连续序列:
-
当
end指针不再指向连续递增的元素时,检查end - start的值:- 如果
end - start >= 2,表示当前连续序列至少有3个元素,将其表示为范围(例如start-end)并加入result。 - 否则,将
start到end之间的每个元素单独加入result。
- 如果
-
-
更新指针:
- 将
start指针移动到end + 1,继续寻找下一个连续序列。
- 将
-
返回结果:
- 将
result列表中的元素用逗号连接成一个字符串并返回。
- 将
具体实现
def solution(plates, n):
plate_nums = list(map(int, plates))
result = []
start = 0
while start < len(plate_nums):
end = start
# 寻找连续的数字
while end + 1 < len(plate_nums) and plate_nums[end + 1] == plate_nums[end] + 1:
end += 1
# 如果有两个或更多的连续数字
if end - start >= 2:
result.append(f"{plate_nums[start]}-{plate_nums[end]}")
else:
for i in range(start, end + 1):
result.append(str(plate_nums[i]))
start = end + 1
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") == "-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") == "-6,-3-1,3-5,7-11,14,15,17-20")
print(solution("1 2 7 8 9 10 11 19") == "1,2,7-11,19")
如何处理输入中的空格和负数?
在处理输入时,空格和负数是两个需要特别注意的问题。让我们来看看如何在代码中处理这些情况。
处理空格
输入的盘子序号是以字符串形式给出的,每个数字之间用空格分隔。你需要将这个字符串转换为一个整数列表。可以使用 split() 方法将字符串按空格分割成一个字符串列表,然后使用 map() 函数将每个字符串转换为整数。
处理负数
负数在字符串中表示为 "-数字",在转换为整数时,Python 会自动处理负号。因此,你不需要特别处理负数,只需确保在转换过程中正确处理字符串即可。
改进方案
在之前的代码中,solution 函数接收一个字符串作为输入,而不是一个整数列表。你需要在函数内部将这个字符串转换为整数列表。
以下是修改后的代码:
def solution(plates):
# 将输入字符串按空格分割,并转换为整数列表
plate_nums = list(map(int, plates.split()))
result = []
start = 0
while start < len(plate_nums):
end = start
# 寻找连续的数字
while end + 1 < len(plate_nums) and plate_nums[end + 1] == plate_nums[end] + 1:
end += 1
# 如果有两个或更多的连续数字
if end - start >= 2:
result.append(f"{plate_nums[start]}-{plate_nums[end]}")
else:
for i in range(start, end + 1):
result.append(str(plate_nums[i]))
start = end + 1
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") == "-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") == "-6,-3-1,3-5,7-11,14,15,17-20")
print(solution("1 2 7 8 9 10 11 19") == "1,2,7-11,19")
关键修改点
-
输入处理:
- 使用
plates.split()将输入字符串按空格分割成一个字符串列表。 - 使用
map(int, ...)将字符串列表转换为整数列表。
- 使用
-
函数签名:
- 修改
solution函数的签名,使其只接收一个字符串参数plates,而不是两个参数plates和n。
- 修改