“青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题”

48 阅读4分钟

问题描述: 小M有一个独特的方式来收拾家中的盘子,每次用餐后,他会将盘子按序号叠放。盘子的序号是唯一的整数,并且在收拾前是递增的。小M的叠放规则是:

每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。 如果有连续的盘子,且其数量至少为3个,则表示为起始值-结束值的形式(例如,-3--1表示盘子序号从-3到-1)。 如果不满足连续递增或数量不足3个的盘子,则直接列出该盘子的序号。 解题思路 初始化:

我们需要遍历盘子的序号列表 plates,并将连续的盘子(长度大于等于3的连续序列)按起始值-结束值的形式叠放。 使用一个索引 i 来遍历盘子列表。 寻找连续的盘子:

从当前盘子开始,检查下一个盘子的序号是否比当前盘子大1(即连续递增)。如果是,则继续检查,直到发现不连续的盘子。 如果连续的盘子数大于等于3个,则以 start--end 的形式记录。 处理不连续或不足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
    # 如果连续序列的长度至少为3,表示为 start--end
    if i - start + 1 >= 3:
        result.append(f"{plates[start]}--{plates[i]}")
    else:
        # 否则逐个盘子添加到结果中
        result.extend(str(plates[j]) for j in range(start, i + 1))
    i += 1  # 继续检查下一个盘子

return ",".join(result)

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") 新知识点总结 连续序列的判断: 通过 plates[i + 1] == plates[i] + 1 判断当前盘子与下一个盘子的差值是否为1,进而判断是否属于连续序列。

字符串拼接: 在处理连续序列时,使用 f"{plates[start]}--{plates[i]}" 来拼接起始值和结束值,表示连续的盘子。

使用列表和字符串的 join() 方法: 使用 ",".join(result) 将列表中的元素按逗号连接成一个字符串,符合题目的输出要求。

条件判断: 通过 if i - start + 1 >= 3 判断连续的盘子是否符合叠放规则(至少3个)。

学习建议 掌握循环和条件判断: 这道题涉及到循环遍历和条件判断的基本应用,是编程中的常见模式。通过这道题,可以加深对 while 循环、if-else 条件判断的理解。

注重代码的简洁性: 在解决问题时,尽量避免过于复杂的实现。比如,通过使用 f-string 和 join(),使得代码更加简洁易读。

调试和测试: 解决类似问题时,建议先手动分析几个小的例子,确保理解题目的要求,再根据思路实现代码,最后通过各种测试用例验证代码的正确性。

高效学习方法 制定刷题计划: 可以通过每天指定一到两个题目,进行集中练习,确保每天都有一定的进步。选择不同难度和类型的题目,保持多样化。

错题回顾: 每次做完题目后,要认真分析错题,找出错误原因,并进行总结。利用错题本或者学习工具记录错题,定期回顾。

AI刷题功能的使用: 通过AI刷题功能,及时获取解题思路和优化建议,避免在某些难题上卡住过久。AI提供的分析能够帮助理解更深入的算法和数据结构技巧。