伴学笔记5| 豆包MarsCode AI刷题

76 阅读3分钟

AI刷题:叠盘子排序

这个问题的目标是根据小M的规则,对盘子的序号进行整理,形成符合条件的字符串。要解决这个问题,首先需要根据盘子序号的连续性进行分组,并将符合条件的连续盘子序号表示成范围(例如“-3--1”表示-3到-1),其他不满足条件的单个盘子直接列出。

解决思路:

  1. 遍历盘子序号列表,识别连续递增的序列。
  2. 如果一个序列的长度小于3,则不合并为范围。
  3. 将符合条件的连续序列(长度大于等于3)用 start-end 形式表示。
  4. 将其余的单个盘子直接列出。
  5. 最后返回由这些序列组成的字符串。

代码实现:

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"

代码解释:

  1. 循环遍历盘子序号列表
    使用 while i < n 来遍历整个盘子列表,i 为当前盘子的索引。

  2. 检查连续递增序列
    使用内嵌的 while 循环来检查当前盘子与下一个盘子的序号是否连续递增(plates[i + 1] == plates[i] + 1)。如果是,就继续前进,直到不再连续。

  3. 分组

    • 如果发现的连续序列长度大于或等于3,就将该序列转化为 "start-end" 的形式。
    • 如果该序列长度小于3,就将其中的每个盘子单独列出。
  4. 生成结果
    将所有的序列按照要求存入 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".

这种方法能够处理连续序列和非连续序列的正确格式化输出。