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

142 阅读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 都应单独列出。

解题思路

  1. 初始化

    • result 列表用于存储处理后的结果字符串。
    • current_sequence 列表用于存储当前正在处理的连续数字序列。
  2. 遍历输入数组

    • 遍历 plates 列表中的每一个元素。

    • 对于每一个元素,判断它是否可以加入到 current_sequence 中:

      • 如果 current_sequence 为空,或者当前元素是 current_sequence 中最后一个元素的下一个连续数字(即 plates[i] == current_sequence[-1] + 1),则将其加入到 current_sequence 中。
      • 否则,说明当前元素无法继续当前序列,需要处理 current_sequence 并重置。
  3. 处理当前序列

    • 如果 current_sequence 的长度大于等于 3,说明这是一个足够长的连续序列,将其表示为 "起始数字-结束数字" 的形式,并添加到 result 中。
    • 否则,说明 current_sequence 长度小于 3,将其中的数字逐个转换为字符串并添加到 result 中。
    • 重置 current_sequence 为当前元素,开始处理新的序列。
  4. 处理最后一个序列

    • 遍历完成后,需要检查并处理 current_sequence,因为最后一个序列可能没有被处理。
    • 处理方式与上述步骤相同。
  5. 返回结果

    • 将 result 列表中的字符串以逗号分隔的形式连接成一个字符串,并返回。

图解示例

假设输入为 plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20] 和 n = 10

  1. 初始化 result = [] 和 current_sequence = []

  2. 遍历 plates

    • -3current_sequence = [-3]
    • -2current_sequence = [-3, -2]
    • -1current_sequence = [-3, -2, -1]
    • 2:处理 current_sequence,得到 result = ["-3--1"]current_sequence = [2]
    • 10current_sequence = [2, 10](无法形成连续序列,直接添加)
    • 15current_sequence = [15]
    • 16current_sequence = [15, 16]
    • 18:处理 current_sequence,得到 result = ["-3--1", "2", "10", "15-16"]current_sequence = [18]
    • 19current_sequence = [18, 19]
    • 20current_sequence = [18, 19, 20]
  3. 处理最后一个序列:result = ["-3--1", "2", "10", "15-16", "18-20"]

  4. 返回结果字符串 "-3--1,2,10,15-16,18-20"

代码详解

1. 函数定义与初始化

python复制代码
	def solution(plates: list[int], n: int) -> str:

	    # 初始化结果列表和当前序列

	    result = []

	    current_sequence = []
  • solution 函数接收两个参数:一个整数列表 plates 和一个整数 n
  • result 列表用于存储处理后的结果字符串。
  • current_sequence 列表用于存储当前正在处理的连续数字序列。

2. 遍历输入数组

python复制代码
	# 遍历输入数组

	    for i in range(n):
  • 使用 for 循环遍历 plates 列表中的每一个元素,索引 i 从 0 到 n-1

3. 判断并处理当前元素

python复制代码
	# 如果当前序列是空的,或者当前元素是当前序列的下一个连续元素

	        if not current_sequence or plates[i] == current_sequence[-1] + 1:

	            current_sequence.append(plates[i])

	        else:

	            # 处理当前序列

	            if len(current_sequence) >= 3:

	                result.append(f"{current_sequence[0]}-{current_sequence[-1]}")

	            else:

	                result.extend(map(str, current_sequence))

	            # 重置当前序列为当前元素

	            current_sequence = [plates[i]]
  • 判断当前元素是否可以加入到 current_sequence 中:

    • 如果 current_sequence 为空,或者当前元素是 current_sequence 中最后一个元素的下一个连续数字,则将其加入到 current_sequence 中。
  • 否则,说明当前元素无法继续当前序列,需要处理 current_sequence

    • 如果 current_sequence 的长度大于等于 3,将其表示为 "起始数字-结束数字" 的形式,并添加到 result 中。
    • 否则,将 current_sequence 中的数字逐个转换为字符串并添加到 result 中。
  • 重置 current_sequence 为当前元素,开始处理新的序列。

4. 处理最后一个序列

python复制代码
	# 处理最后一个序列

	    if len(current_sequence) >= 3:

	        result.append(f"{current_sequence[0]}-{current_sequence[-1]}")

	    else:

	        result.extend(map(str, current_sequence))
  • 遍历完成后,需要检查并处理 current_sequence,因为最后一个序列可能没有被处理。
  • 处理方式与上述步骤相同:根据 current_sequence 的长度,将其转换为相应的字符串形式并添加到 result 中。

5. 返回结果字符串

python复制代码
	# 返回结果字符串

	    return ",".join(result)
  • 将 result 列表中的字符串以逗号分隔的形式连接成一个字符串,并返回。

6. 主函数与测试用例

python复制代码
	if __name__ == "__main__":

	    # 你可以添加更多测试用例

	    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")
  • if __name__ == "__main__": 语句确保以下代码仅在脚本作为主程序运行时执行。
  • 使用 print 语句添加多个测试用例,验证 solution 函数的正确性。
  • 每个测试用例将 solution 函数的输出与预期结果进行比较,如果相等则打印 True,否则打印 False

总结

本题主要考察了如何对连续的数字序列进行识别和处理,并将其转换为特定的字符串表示形式。通过遍历输入数组并使用辅助列表来跟踪当前序列,可以有效地解决这一问题。同时,需要注意处理边界情况,如最后一个序列的处理。