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

39 阅读7分钟

问题描述

小C拿到了一个排列,她想知道在这个排列中,元素 xx 和 yy 是否是相邻的。排列是一个长度为 nn 的数组,其中每个数字从 11 到 nn 恰好出现一次。

你的任务是判断在给定的排列中,xx 和 yy 是否是相邻的。

def solution(n: int, a: list, x: int, y: int) -> bool:
# 遍历数组,检查相邻元素
for i in range(n - 1):  # 注意:这里只需要遍历到倒数第二个元素
    # 检查当前元素和下一个元素是否分别是 x 和 y,或者 y 和 x
    if (a[i] == x and a[i + 1] == y) or (a[i] == y and a[i + 1] == x):
        return True  # 如果找到相邻的 x 和 y,返回 True
return False  # 如果遍历结束仍未找到,返回 False

if __name__ == '__main__':
print(solution(4, [1, 4, 2, 3], 2, 4) == True)
print(solution(5, [3, 4, 5, 1, 2], 3, 2) == False)
print(solution(6, [6, 1, 5, 2, 4, 3], 5, 2) == True)def solution(n: int, a: list, x:     int, y: int) -> bool:
# 遍历数组,检查相邻元素
for i in range(n - 1):  # 注意:这里只需要遍历到倒数第二个元素
    # 检查当前元素和下一个元素是否分别是 x 和 y,或者 y 和 x
    if (a[i] == x and a[i + 1] == y) or (a[i] == y and a[i + 1] == x):
        return True  # 如果找到相邻的 x 和 y,返回 True
return False  # 如果遍历结束仍未找到,返回 False

if __name__ == '__main__':
print(solution(4, [1, 4, 2, 3], 2, 4) == True)
print(solution(5, [3, 4, 5, 1, 2], 3, 2) == False)
print(solution(6, [6, 1, 5, 2, 4, 3], 5, 2) == True)

思路

  • 这道题目的核心思路是遍历给定的排列数组,去检查元素 x 和 y 是否相邻出现。因为排列是长度为 n 的数组且每个数字从 1 到 n 恰好出现一次,所以我们只需要依次查看数组中每对相邻的元素就可以了。通过一个 for 循环从数组的第一个元素开始,一直到倒数第二个元素(因为检查相邻元素只需要到这里,最后一个元素没有下一个相邻元素可对比了),在每次循环中,判断当前元素和它的下一个元素是否刚好是 x 和 y 或者 y 和 x 的组合,如果找到了这样的相邻情况,那就说明 x 和 y 是相邻的,直接返回 True;要是整个循环结束了,都没有发现这样的相邻组合,那就意味着 x 和 y 在这个排列中不是相邻的,返回 False
  1. 遍历数组:你可以使用一个循环来遍历数组 a
  2. 检查相邻元素:在每次循环中,检查当前元素和下一个元素是否分别是 x 和 y,或者 y 和 x
  3. 返回结果:如果在遍历过程中找到了相邻的 x 和 y,则返回 True;如果遍历结束仍未找到,则返回 False

知识总结

在使用豆包 MarsCode AI 刷题的过程中,对于这道题可以总结出以下新知识点:

  • 列表的遍历技巧:像本题中通过 for 循环结合 range 函数来遍历列表中除最后一个元素之外的所有元素,以检查相邻元素关系,这是一种很常用的列表遍历方式,在很多涉及顺序数据结构操作的题目中都会用到。理解如何控制循环的范围来准确获取需要检查的元素对是关键,比如这里循环到 n - 1 而不是 n,就是为了避免出现超出列表索引范围去访问不存在的下一个元素的情况(因为最后一个元素没有下一个相邻元素了)。
  • 条件判断逻辑的组合运用:代码中使用 or 逻辑运算符来组合两种可能的相邻元素情况判断,即 (a[i] == x and a[i + 1] == y) or (a[i] == y and a[i + 1] == x),这种将多个条件判断通过逻辑运算符组合起来的方式,可以灵活处理多种满足需求的情况。对于入门同学来说,要仔细分析每个条件的含义以及它们之间的逻辑关系,确保涵盖了所有想要判断的场景,避免遗漏或者错误判断的情况出现。
  • 自己手动推导代码执行过程:在理解了代码思路和逻辑后,最好能自己在纸上或者脑海中手动推导一下代码的执行过程,比如按照代码逻辑依次去想象每一次循环中变量的值变化、条件判断的结果等,这样能更深入地理解代码的运行机制,发现可能存在的理解误区,有助于提升编程思维能力。

学习计划

结合豆包 MarsCode AI 刷题功能,以下是一些高效学习方法以及刷题计划制定等方面的建议:

  • 制定合理的刷题计划

    • 按知识点分类刷题:首先将题库中的题目按照知识点进行分类,比如分为数组操作、字符串处理、逻辑判断等不同类别。然后根据自己对各个知识点的掌握程度,制定先易后难的刷题顺序。例如对于刚开始学习编程的同学,可以先从像本题这样简单的数组遍历和条件判断类题目入手,把基础打扎实后,再去挑战涉及多个知识点综合运用的更复杂题目,比如数组和递归、排序算法等知识点结合的题目。
    • 控制刷题数量和时间:每天给自己设定一个合理的刷题数量目标,不要贪多,比如刚开始可以每天刷 5 - 10 道题,保证每道题都能真正理解透彻。同时,要注意合理分配时间,给每道题足够的思考时间,一般可以先花 10 - 15 分钟自己尝试去分析思路、写代码,如果遇到困难,再去参考题解或者向 AI 寻求帮助,分析完题解后自己再重新梳理一遍思路,动手把代码完整写出来,这样一道题可能总共花费 20 - 30 分钟左右,根据自己的实际情况合理安排时间和数量。
  • 利用错题进行针对性学习

    • 整理错题集:把做错的题目整理到一个专门的文档或者笔记软件中,记录下错误的原因(比如是思路错误、代码语法错误、对某个知识点理解有误等),以及正确的解题思路和代码实现方式。
    • 定期回顾错题:每隔一段时间(比如一周或者两周)就重新回顾一下错题集,重新做一遍错题,看看自己是否真正掌握了正确的解法,如果还是做错了,就再次分析原因,加强对相关知识点的学习,还可以找一些类似的题目进行巩固练习,直到彻底掌握为止。

工具运用

为了达到更好的学习效果,可以将 AI 刷题功能与其他学习资源相结合,以下是一些实用的学习建议:

  • 结合在线教程学习基础知识:在刷题之前,最好先通过一些在线的编程教程(比如菜鸟教程、慕课网等网站上的免费编程课程)系统地学习相关的编程语言基础,比如 Python 的语法、数据类型、控制结构等知识,打好基础后再去刷题,这样在刷题过程中就能更专注于解题思路和算法逻辑,而不是被基础的语法问题所困扰。
  • 参考书籍深入理解知识点:选择一些经典的编程入门书籍(例如 Python 语言可以参考《Python 编程从入门到实践》等),书籍中对于知识点的讲解往往更加系统和深入,当在刷题过程中遇到对某些知识点理解不够透彻的情况时,可以查阅相关书籍的对应章节,进一步加深理解,然后再回到刷题中运用所学知识去解题。