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

103 阅读5分钟

题目内容

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

例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。

输入参数

  • plates: 一个整数数组,表示盘子的序号
  • n: 盘子总数

测试样例

样例1:

输入:plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10
输出:-3--1,2,10,15,16,18-20

样例2:

输入: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

样例3:

输入:plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8
输出:1,2,7-11,19

题目解析:

题目要求我们按照给定规则将盘子序号进行合理的叠放,并返回最终的结果。盘子序号是唯一且递增的,叠放的规则是连续的盘子应该合并为一个区间,而不连续的盘子则单独列出。这个问题的本质是找到连续的子序列并将其归纳成区间表示。

思路分析:

  1. 遍历盘子序号:我们需要遍历所有的盘子序号,找出连续递增的子序列。

  2. 处理连续序列

    • 如果连续的盘子数量大于或等于3,将其合并成区间格式,如 start-end
    • 如果连续盘子的数量小于3,直接列出这些盘子。
  3. 边界处理:需要处理最后一部分的盘子,尤其是当最后一个序列是连续递增时。

  4. 输出结果:根据要求将合并后的结果通过逗号连接。

解决方案:

  1. 遍历盘子序号:从左到右遍历所有盘子的序号,判断它们是否是连续递增的。
  2. 判断连续子序列长度:当连续盘子的数量大于等于3时,将它们合并为一个区间。
  3. 处理剩余的盘子:当不再连续时,将不连续的盘子单独列出。
  4. 返回最终的结果:最终拼接所有区间或盘子的字符串,返回。

代码实现:

def solution(plates, n):
    result = []  # 存储结果
    start = plates[0]  # 子序列的起始盘子
    count = 1  # 记录当前连续的盘子数量

    # 遍历盘子序列,从第二个元素开始
    for i in range(1, len(plates)):
        if plates[i] == plates[i - 1] + 1:
            # 如果当前盘子和前一个盘子是连续的,增加计数
            count += 1
        else:
            # 如果当前序列长度 >= 3,加入区间表示
            if count >= 3:
                result.append(f"{start}-{plates[i-1]}")
            else:
                # 否则将该段的盘子逐一列出
                for j in range(start, plates[i-1] + 1):
                    result.append(str(j))
            start = plates[i]  # 更新起始盘子
            count = 1  # 重置计数器

    # 处理最后一个序列
    if count >= 3:
        result.append(f"{start}-{plates[-1]}")
    else:
        for j in range(start, plates[-1] + 1):
            result.append(str(j))

    # 返回最终的结果字符串,用逗号连接各部分
    return ",".join(result)

代码解释:

  • 初始化变量

    • result 用来存储最终的结果。
    • start 记录当前连续区间的起始盘子编号。
    • count 用来计数当前连续的盘子数量。
  • 遍历盘子序号

    • 通过遍历盘子的序号,判断每个盘子与前一个盘子是否连续:

      • 如果连续(即 plates[i] == plates[i-1] + 1),增加 count

      • 如果不连续,则根据当前 count 来判断是否形成一个区间:

        • 如果连续盘子的数量大于或等于3,则以区间形式(例如 -3--1)添加到 result 中;
        • 否则逐个列出这些盘子。
  • 处理最后一段

    • 最后一段没有后续盘子进行判断,需要单独处理。
  • 返回结果

    • 最后将结果列表用逗号连接成字符串返回。

示例测试:

  1. 样例1

    print(solution([-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], 10)) # 输出:"-3--1,2,10,15,16,18-20"
    
  2. 样例2

    print(solution([1, 2, 3, 4], 4)) # 输出:"1-4"
    

时间复杂度:

  • O(n)O(n),其中 nn 是盘子的数量。我们只遍历了一遍盘子的序列,每个盘子的处理时间是常数级别。

空间复杂度:

  • O(n)O(n),用于存储结果。

总结

这个问题的关键是通过遍历盘子的序号,判断哪些盘子是连续的,哪些不是。对于连续的盘子,如果长度大于或等于3,则以区间表示,其他的单独列出。通过模拟小M的叠放规则,我们能有效地得出结果。

使用豆包marscode AI的优势

在解决这类问题时,豆包marscode AI可以提供以下优势:

  • 思路提示:AI能够帮助逐步分析这个问题,并提供一些思路提示。
  • 代码生成:AI能够根据问题描述快速生成相应的代码框架,节省时间。

5a5ee3bd614b1e3a9f833c17051cf95.png

  • 错误检测:AI能够检测代码中的错误,并提供修改建议,确保正确性。

fde3441e573216f56a89591e4bba6d5.png