题目内容
小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
题目解析:
题目要求我们按照给定规则将盘子序号进行合理的叠放,并返回最终的结果。盘子序号是唯一且递增的,叠放的规则是连续的盘子应该合并为一个区间,而不连续的盘子则单独列出。这个问题的本质是找到连续的子序列并将其归纳成区间表示。
思路分析:
-
遍历盘子序号:我们需要遍历所有的盘子序号,找出连续递增的子序列。
-
处理连续序列:
- 如果连续的盘子数量大于或等于3,将其合并成区间格式,如
start-end。 - 如果连续盘子的数量小于3,直接列出这些盘子。
- 如果连续的盘子数量大于或等于3,将其合并成区间格式,如
-
边界处理:需要处理最后一部分的盘子,尤其是当最后一个序列是连续递增时。
-
输出结果:根据要求将合并后的结果通过逗号连接。
解决方案:
- 遍历盘子序号:从左到右遍历所有盘子的序号,判断它们是否是连续递增的。
- 判断连续子序列长度:当连续盘子的数量大于等于3时,将它们合并为一个区间。
- 处理剩余的盘子:当不再连续时,将不连续的盘子单独列出。
- 返回最终的结果:最终拼接所有区间或盘子的字符串,返回。
代码实现:
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中; - 否则逐个列出这些盘子。
- 如果连续盘子的数量大于或等于3,则以区间形式(例如
-
-
-
处理最后一段:
- 最后一段没有后续盘子进行判断,需要单独处理。
-
返回结果:
- 最后将结果列表用逗号连接成字符串返回。
示例测试:
-
样例1:
print(solution([-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], 10)) # 输出:"-3--1,2,10,15,16,18-20" -
样例2:
print(solution([1, 2, 3, 4], 4)) # 输出:"1-4"
时间复杂度:
- ,其中 是盘子的数量。我们只遍历了一遍盘子的序列,每个盘子的处理时间是常数级别。
空间复杂度:
- ,用于存储结果。
总结
这个问题的关键是通过遍历盘子的序号,判断哪些盘子是连续的,哪些不是。对于连续的盘子,如果长度大于或等于3,则以区间表示,其他的单独列出。通过模拟小M的叠放规则,我们能有效地得出结果。
使用豆包marscode AI的优势
在解决这类问题时,豆包marscode AI可以提供以下优势:
- 思路提示:AI能够帮助逐步分析这个问题,并提供一些思路提示。
- 代码生成:AI能够根据问题描述快速生成相应的代码框架,节省时间。
- 错误检测:AI能够检测代码中的错误,并提供修改建议,确保正确性。