问题描述
小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 的列表,该列表包含了一系列整数,代表盘子上的编号。函数将这些盘子编号按照连续区间进行分组,并以字符串的形式返回这些区间的表示。
以下是函数的工作流程:
- 初始化区间列表:首先,函数创建了一个名为
intervals的列表,用于存储连续的盘子编号区间。这个列表以plates列表的第一个元素作为起始和结束点初始化第一个区间。 - 遍历盘子编号:然后,函数遍历
plates列表中的剩余元素(从第二个元素开始)。对于每个盘子编号,它检查是否与前一个区间结束点连续(即当前编号等于前一个区间结束点加1)。如果是,则更新前一个区间的结束点为这个新的编号,表示区间扩展了。如果不是,则创建一个新的区间,以当前编号作为起始和结束点。 - 构建结果字符串:接下来,函数遍历
intervals列表中的每个区间,并根据区间的长度构建结果字符串。如果区间只包含一个编号(即起始点和结束点相同),则直接将这个编号转换为字符串并添加到结果列表中。如果区间包含两个连续的编号(即起始点和结束点相差1),则将这两个编号转换为字符串并添加到结果列表中。对于包含多个连续编号的区间(即起始点和结束点不相同且相差大于1),则以 "起始点-结束点" 的格式添加到结果列表中。 - 返回结果:最后,函数将结果列表中的所有字符串用逗号连接成一个单一的字符串,并返回这个字符串。
这个函数可以用于处理一系列连续的或间断的盘子编号,并以易于理解的格式(例如 "1,2-4,7")表示这些编号。
知识点总结
数据结构
-
列表(List) :
- Python 中的一种数据结构,用于存储一系列有序的元素。
- 在这个函数中,列表被用于存储盘子编号(
plates)和区间(intervals)。
-
字符串(String) :
- Python 中的一种数据类型,用于表示文本。
- 在这个函数中,字符串被用于表示最终的区间结果,并通过逗号连接多个区间。
控制结构
-
循环(Loop) :
- 用于重复执行一段代码直到满足特定条件。
- 在这个函数中,使用了
for循环来遍历plates列表中的元素。
-
条件判断(Conditional Statement) :
- 用于根据条件执行不同的代码块。
- 在这个函数中,使用了
if语句来判断当前盘子编号是否与前一个区间连续。
函数和参数
-
函数定义(Function Definition) :
- 用于创建可以重复使用的代码块。
- 在这个函数中,
solution函数接收两个参数(尽管n未被使用)。
-
参数(Parameter) :
- 函数定义时指定的变量,用于接收传递给函数的值。
- 在这个函数中,
plates是一个必要的参数,而n是一个未使用的参数。
字符串操作
-
字符串格式化(String Formatting) :
- 用于构建包含变量值的字符串。
- 在这个函数中,使用了 f-string(格式化字符串字面量)来构建区间表示。
-
字符串连接(String Concatenation) :
- 用于将多个字符串合并成一个字符串。
- 在这个函数中,使用了
join方法将结果列表中的字符串用逗号连接起来。
列表操作
-
列表追加(List Append) :
- 用于在列表末尾添加一个新元素。
- 在这个函数中,使用了
append方法向intervals和ans列表中添加元素。
-
列表扩展(List Extend) :
- 用于将一个列表中的所有元素添加到另一个列表的末尾。
- 在这个函数中,使用了
extend方法将两个连续编号添加到ans列表中。
算法逻辑
-
区间合并(Interval Merging) :
- 一种常见的算法问题,用于合并一系列重叠或相邻的区间。
- 在这个函数中,通过检查每个盘子编号是否与前一个区间连续来实现区间合并。
综上所述,这个函数涉及了 Python 中的数据结构、控制结构、函数和参数、字符串操作、列表操作以及算法逻辑等多个知识点。