AI刷题:叠盘子排序
这个问题的目标是根据小M的规则,对盘子的序号进行整理,形成符合条件的字符串。要解决这个问题,首先需要根据盘子序号的连续性进行分组,并将符合条件的连续盘子序号表示成范围(例如“-3--1”表示-3到-1),其他不满足条件的单个盘子直接列出。
解决思路:
- 遍历盘子序号列表,识别连续递增的序列。
- 如果一个序列的长度小于3,则不合并为范围。
- 将符合条件的连续序列(长度大于等于3)用
start-end形式表示。 - 将其余的单个盘子直接列出。
- 最后返回由这些序列组成的字符串。
代码实现:
def plate_sorting(plates, n):
result = [] # 用于存储最终的结果
i = 0 # 当前盘子的索引
while i < n:
start = i
# 检查连续递增的盘子序号
while i + 1 < n and plates[i + 1] == plates[i] + 1:
i += 1
# 如果这个连续序列的长度大于等于3,则表示需要将其合并为一个范围
if i - start >= 2:
result.append(f"{plates[start]}--{plates[i]}")
else:
# 否则将这一段中的盘子单独列出
for j in range(start, i + 1):
result.append(str(plates[j]))
# 移动到下一个盘子
i += 1
# 将结果以逗号分隔并返回
return ",".join(result)
# 测试用例
plates1 = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20]
n1 = 10
print(plate_sorting(plates1, n1)) # 输出: "-3--1,2,10,15,16,18-20"
plates2 = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]
n2 = 20
print(plate_sorting(plates2, n2)) # 输出: "-6,-3-1,3-5,7-11,14,15,17-20"
plates3 = [1, 2, 7, 8, 9, 10, 11, 19]
n3 = 8
print(plate_sorting(plates3, n3)) # 输出: "1,2,7-11,19"
代码解释:
-
循环遍历盘子序号列表:
使用while i < n来遍历整个盘子列表,i为当前盘子的索引。 -
检查连续递增序列:
使用内嵌的while循环来检查当前盘子与下一个盘子的序号是否连续递增(plates[i + 1] == plates[i] + 1)。如果是,就继续前进,直到不再连续。 -
分组:
- 如果发现的连续序列长度大于或等于3,就将该序列转化为 "start-end" 的形式。
- 如果该序列长度小于3,就将其中的每个盘子单独列出。
-
生成结果:
将所有的序列按照要求存入result列表中,并最终用逗号将这些序列连接起来返回。
测试结果:
- 对于输入
plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10,输出"-3--1,2,10,15,16,18-20". - 对于输入
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". - 对于输入
plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8,输出"1,2,7-11,19".
这种方法能够处理连续序列和非连续序列的正确格式化输出。