叠盘子排序 | 豆包MarsCode AI 刷题

61 阅读4分钟

今天我们将在豆包MarsCode AI刷题平台上,完成《叠盘子排序》这个算法问题,通过练习提升用户解决此类问题的能力。

《叠盘子排序》题目如下:

image.png

问题理解

你需要将一个整数数组中的元素按照连续递增的规则进行分组。如果一组连续递增的元素数量大于等于3,则将它们表示为一个范围(例如 1-3);否则,将它们单独列出。

数据结构选择

  • 使用一个列表来存储最终的结果。
  • 使用两个指针 start 和 end 来遍历数组,寻找连续递增的子序列。

算法步骤

  1. 初始化

    • 创建一个空列表 result 用于存储最终的结果。
    • 初始化指针 start 为0,表示当前连续序列的起始位置。
  2. 遍历数组

    • 使用 end 指针从 start 开始向后遍历,寻找连续递增的子序列。
    • 如果 end 指针指向的元素是 start 指针指向元素的连续递增元素,则继续移动 end 指针。
  3. 处理连续序列

    • 当 end 指针不再指向连续递增的元素时,检查 end - start 的值:

      • 如果 end - start >= 2,表示当前连续序列至少有3个元素,将其表示为范围(例如 start-end)并加入 result
      • 否则,将 start 到 end 之间的每个元素单独加入 result
  4. 更新指针

    • 将 start 指针移动到 end + 1,继续寻找下一个连续序列。
  5. 返回结果

    • 将 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")

关键修改点

  1. 输入处理

    • 使用 plates.split() 将输入字符串按空格分割成一个字符串列表。
    • 使用 map(int, ...) 将字符串列表转换为整数列表。
  2. 函数签名

    • 修改 solution 函数的签名,使其只接收一个字符串参数 plates,而不是两个参数 plates 和 n