一、题目:计算从位置 x 到 y 的最少步数
原问题描述: AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。
我们假设每一步对应到每一个位置。从一个整数位置 x 走到另外一个整数位置 y,每一步的长度是正整数,每步的值等于上一步的值 -1, +0,+1。求 x 到 y 最少走几步。并且第一步必须是 1,最后一步必须是 1,从 x 到 y 最少需要多少步。
样例说明: 整数位置 x 为 12,另外一个整数位置 y 为 6,我们需要从 x 走到 y,最小的步数为:1,2,2,1,所以我们需要走 4 步。 整数位置 x 为 34,另外一个整数位置 y 为 45,我们需要从 x 走到 y,最小的步数为:1,2,3,2,2,1,所以我们需要走 6 步。 整数位置 x 为 50,另外一个整数位置 y 为 30,我们需要从 x 走到 y,最小的步数为:1,2,3,4,4,3,2,1,所以我们需要走 8 步。 输入格式: 输入包含 2 个整数 x,y。(0<=x<=y<2^31)
输出格式: 对于每一组数据,输出一行,仅包含一个整数,从 x 到 y 所需最小步数。
输入样例: 12 6 34 45 50 30
输出样例: 4 6 8
Python 代码:
def solution(xPosition, yPosition): x = abs(xPosition - yPosition) cnt = 1 while x > 2 * cnt: x -= 2 * cnt cnt += 1
if x == 0:
return cnt * 2 - 2
if x > 0 and x <= cnt:
return cnt * 2 - 1
if x >= cnt and x <= 2 * cnt:
return cnt * 2
return 0
if name == "main": # You can add more test cases here print(solution(12, 6) == 4 ) print(solution(34, 45) == 6) print(solution(50, 30) == 8)
题目解析:简单数学
MarsCode AI 刷题总结分析
二、知识点梳理
在使用 MarsCode AI 刷题过程中,我接触到了许多之前未曾深入理解的编程概念和算法逻辑。例如在数据结构方面,对链表的操作有了更清晰的认识,包括链表的创建、节点的插入与删除等。对于算法部分,动态规划算法的应用场景和解题思路逐渐清晰,像求解最长递增子序列问题,通过动态规划的状态转移方程能够高效地得出结果。另外,在处理字符串相关题目时,掌握了一些高效的字符串匹配算法,如 KMP 算法的基本原理和实现步骤。
三、个人理解
• 链表操作:链表相较于数组,其优势在于动态内存分配和灵活的插入删除操作。理解链表的关键在于把握指针的指向变化,每一个节点的指针指向下一个节点从而形成链状结构。在插入节点时,要先调整新节点的指针指向,再改变前一个节点的指针指向新节点;删除节点则是将前一个节点的指针绕过要删除的节点直接指向其后继节点。
• 动态规划:它是一种通过将大问题分解为子问题,并记录子问题的解来避免重复计算的优化算法策略。以最长递增子序列为例,我们定义一个状态数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度。通过遍历数组,比较当前元素与之前元素的大小关系,不断更新 dp 数组,最终找出整个数组中的最长递增子序列长度。其核心思想是利用之前计算得到的子结果来构建最终的答案,大大提高了计算效率。
• KMP 算法:在字符串匹配中,KMP 算法能够在 O(n + m) 的时间复杂度内完成匹配操作(n 为文本串长度,m 为模式串长度),相比暴力匹配的 O(n*m) 有很大提升。它的核心在于利用模式串的前缀和后缀的最长公共子序列长度构建 next 数组,在匹配过程中,当遇到不匹配字符时,根据 next 数组快速调整模式串的指针位置,从而减少不必要的匹配尝试。
四、学习建议
• 对于入门同学:首先要扎实掌握基础编程语言语法知识,这是理解和实现各种算法和数据结构的基础。在刷题时,不要急于求成,对于每一道题要深入分析其涉及的知识点和解题思路,多尝试自己手动编写代码,即使一开始可能会出现很多错误。
• 学习数据结构:可以从简单的数据结构如数组、链表开始,通过实际编程操作来理解它们的特性和基本操作。可以自己构建一些小型的数据结构应用场景,比如用链表实现一个简单的学生信息管理系统,加深对链表的理解和运用能力。
• 攻克算法:从基础算法如排序算法(冒泡排序、快速排序等)入手,理解算法的思想和时间复杂度分析。在学习动态规划等较难的算法时,多结合具体的例题进行分析,尝试画出状态转移图,将抽象的概念具象化。对于字符串算法,要注重对字符串处理函数的熟悉和理解,多练习不同类型的字符串匹配和操作题目。同时,要善于利用 MarsCode AI 等工具提供的解释和示例代码,学习优秀的编程习惯和逻辑思维方式,但不能过度依赖,要培养自己独立思考和解决问题的能力。