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

149 阅读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"


代码示例

def solution(plates, n):
    intervals = [[plates[0], plates[0]]]
    for plate in plates[1:]:
        if plate == intervals[-1][1] + 1:
            intervals[-1][1] += 1
        else:
            intervals.append([plate, plate])
    ans = list()
    for l, r in intervals:
        if l == r: 
            ans.append(str(l))
        elif r == l + 1:
            ans.extend([str(l), str(r)])
        else:
            ans.append(f"{l}-{r}")
    return ",".join(ans)

代码解析

这段代码定义了一个名为 solution 的函数,它接收两个参数:plates 和 n。这个函数的主要目的是处理一个名为 plates 的列表,该列表包含了一系列整数,代表盘子上的编号。函数将这些盘子编号按照连续区间进行分组,并以字符串的形式返回这些区间的表示。

以下是函数的工作流程:

  1. 初始化区间列表:首先,函数创建了一个名为 intervals 的列表,用于存储连续的盘子编号区间。这个列表以 plates 列表的第一个元素作为起始和结束点初始化第一个区间。
  2. 遍历盘子编号:然后,函数遍历 plates 列表中的剩余元素(从第二个元素开始)。对于每个盘子编号,它检查是否与前一个区间结束点连续(即当前编号等于前一个区间结束点加1)。如果是,则更新前一个区间的结束点为这个新的编号,表示区间扩展了。如果不是,则创建一个新的区间,以当前编号作为起始和结束点。
  3. 构建结果字符串:接下来,函数遍历 intervals 列表中的每个区间,并根据区间的长度构建结果字符串。如果区间只包含一个编号(即起始点和结束点相同),则直接将这个编号转换为字符串并添加到结果列表中。如果区间包含两个连续的编号(即起始点和结束点相差1),则将这两个编号转换为字符串并添加到结果列表中。对于包含多个连续编号的区间(即起始点和结束点不相同且相差大于1),则以 "起始点-结束点" 的格式添加到结果列表中。
  4. 返回结果:最后,函数将结果列表中的所有字符串用逗号连接成一个单一的字符串,并返回这个字符串。

这个函数可以用于处理一系列连续的或间断的盘子编号,并以易于理解的格式(例如 "1,2-4,7")表示这些编号。


知识点总结

数据结构

  1. 列表(List)

    • Python 中的一种数据结构,用于存储一系列有序的元素。
    • 在这个函数中,列表被用于存储盘子编号(plates)和区间(intervals)。
  2. 字符串(String)

    • Python 中的一种数据类型,用于表示文本。
    • 在这个函数中,字符串被用于表示最终的区间结果,并通过逗号连接多个区间。

控制结构

  1. 循环(Loop)

    • 用于重复执行一段代码直到满足特定条件。
    • 在这个函数中,使用了 for 循环来遍历 plates 列表中的元素。
  2. 条件判断(Conditional Statement)

    • 用于根据条件执行不同的代码块。
    • 在这个函数中,使用了 if 语句来判断当前盘子编号是否与前一个区间连续。

函数和参数

  1. 函数定义(Function Definition)

    • 用于创建可以重复使用的代码块。
    • 在这个函数中,solution 函数接收两个参数(尽管 n 未被使用)。
  2. 参数(Parameter)

    • 函数定义时指定的变量,用于接收传递给函数的值。
    • 在这个函数中,plates 是一个必要的参数,而 n 是一个未使用的参数。

字符串操作

  1. 字符串格式化(String Formatting)

    • 用于构建包含变量值的字符串。
    • 在这个函数中,使用了 f-string(格式化字符串字面量)来构建区间表示。
  2. 字符串连接(String Concatenation)

    • 用于将多个字符串合并成一个字符串。
    • 在这个函数中,使用了 join 方法将结果列表中的字符串用逗号连接起来。

列表操作

  1. 列表追加(List Append)

    • 用于在列表末尾添加一个新元素。
    • 在这个函数中,使用了 append 方法向 intervals 和 ans 列表中添加元素。
  2. 列表扩展(List Extend)

    • 用于将一个列表中的所有元素添加到另一个列表的末尾。
    • 在这个函数中,使用了 extend 方法将两个连续编号添加到 ans 列表中。

算法逻辑

  1. 区间合并(Interval Merging)

    • 一种常见的算法问题,用于合并一系列重叠或相邻的区间。
    • 在这个函数中,通过检查每个盘子编号是否与前一个区间连续来实现区间合并。

综上所述,这个函数涉及了 Python 中的数据结构、控制结构、函数和参数、字符串操作、列表操作以及算法逻辑等多个知识点。