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

32 阅读3分钟

问题描述

小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 都应单独列出。

问题理解

我们需要将一个有序的整数数组中的元素按照一定的规则进行分组,并输出分组后的结果。具体规则是:

  • 每一组中的元素必须是连续递增的。
  • 每一组至少包含3个元素。
  • 如果一组元素不满足至少包含3个元素的条件,则单独列出。

数据结构选择

由于输入的数组是有序的,我们可以使用一个指针来遍历数组,并记录当前组的起始位置和结束位置。

算法步骤

  1. 初始化

    • 使用一个指针 i 来遍历数组。
    • 初始化一个空列表 result 来存储最终的结果。
  2. 遍历数组

    • 对于每个元素,检查它是否与前一个元素连续递增。

    • 如果连续递增,继续检查下一个元素。

    • 如果不再连续递增,检查当前组的元素个数:

      • 如果元素个数大于等于3,将该组加入 result
      • 如果元素个数小于3,将每个元素单独加入 result
  3. 处理最后一个组

    • 遍历结束后,检查最后一个组的元素个数,并按照上述规则处理。

思考和感想

对于这个问题,由于输入的数组是有序的,我们可以利用这一特性来简化问题。有序数组意味着我们可以通过简单的比较来判断元素是否连续递增,我们可以使用双指针法来遍历数组。一个指针用于标记当前组的起始位置,另一个指针用于遍历数组并找到当前组的结束位置,我们需要检查当前组的元素个数是否满足至少包含3个元素的条件。如果满足,则将该组作为一个整体加入结果;如果不满足,则将该组中的每个元素单独加入结果。

这个题目虽然是一个算法题,但它背后的逻辑在实际应用中也有一定的价值。例如,在数据处理、日志分析等领域,我们经常需要对有序数据进行分组和处理。

实现代码

def solution(plates: list[int], n: int) -> str:
    result = []
    i = 0
    
    while i < n:
        start = i
        # 找到连续递增的序列
        while i + 1 < n and plates[i + 1] == plates[i] + 1:
            i += 1
        end = i
        
        # 检查序列长度
        if end - start + 1 >= 3:
            # 将连续递增的序列加入结果
            result.append(f"{plates[start]}-{plates[end]}")
        else:
            # 将不满足条件的元素单独加入结果
            for j in range(start, end + 1):
                result.append(str(plates[j]))
        
        i += 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], 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")
​