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

66 阅读3分钟

题目

1732364920760.png

代码实现

def solution(plates: list[int], n: int) -> str:
    # Please write your code here
    if n == 0:
        return ""
    
    result = []
    start = 0  # 当前连续序列的起始位置
    
    for i in range(1, n):
        # 检查当前盘子是否与前一个盘子连续
        if plates[i] != plates[i - 1] + 1:
            # 如果当前连续序列的长度大于等于3
            if i - start >= 3:
                result.append(f"{plates[start]}-{plates[i - 1]}")
            else:
                for j in range(start, i):
                    result.append(str(plates[j]))
            start = i  # 更新新的连续序列的起始位置
    
    # 处理最后一个序列
    if n - start >= 3:
        result.append(f"{plates[start]}-{plates[n - 1]}")
    else:
        for j in range(start, n):
            result.append(str(plates[j]))
    
    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], 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")

问题描述

小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序摆放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。不满足连续递增至少3个的盘子序号需要单独列出。需要编写程序帮助小M确定盘子的叠放方式。

解决方案

为了帮助小M确定盘子的叠放方式,我们可以使用以下步骤:

  1. 初始化变量

    • result:用于存储最终结果的列表。
    • start:当前连续序列的起始位置。
  2. 遍历盘子序号

    • 使用一个循环从第二个盘子开始遍历。

    • 检查当前盘子是否与前一个盘子连续。

    • 如果不连续:

      • 检查当前连续序列的长度是否大于等于3。
      • 如果是,将其添加到结果列表中,格式为 start-end
      • 如果不是,将该序列中的每个盘子单独添加到结果列表中。
      • 更新 start 为当前盘子的位置。
  3. 处理最后一个序列

    • 检查最后一个序列的长度是否大于等于3。
    • 如果是,将其添加到结果列表中,格式为 start-end
    • 如果不是,将该序列中的每个盘子单独添加到结果列表中。
  4. 返回结果

    • 将结果列表中的字符串用逗号连接起来,返回最终结果。

代码解释

  1. 初始化变量

    • result = []:用于存储最终结果的列表。
    • start = 0:当前连续序列的起始位置。
  2. 遍历盘子序号

    • for i in range(1, n):从第二个盘子开始遍历。
    • if plates[i] != plates[i - 1] + 1:检查当前盘子是否与前一个盘子连续。
    • if i - start >= 3:如果当前连续序列的长度大于等于3,将其添加到结果列表中,格式为 start-end
    • 否则,将该序列中的每个盘子单独添加到结果列表中。
    • start = i:更新新的连续序列的起始位置。
  3. 处理最后一个序列

    • if n - start >= 3:检查最后一个序列的长度是否大于等于3,如果是,将其添加到结果列表中,格式为 start-end
    • 否则,将该序列中的每个盘子单独添加到结果列表中。
  4. 返回结果

    • return ",".join(result):将结果列表中的字符串用逗号连接起来,返回最终结果。

总结与反思

通过上述方法,我们能够高效地确定盘子的叠放方式。这种方法的时间复杂度为 O(n),其中 n 是盘子的总数。通过遍历盘子序号并记录连续序列的起始位置,我们能够快速识别出符合条件的连续序列,并将其正确地表示出来。