计算从位置 x 到 y 的最少步数 青训营打卡day7 | 豆包MarsCode AI刷题

118 阅读2分钟

问题描述

小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。

输入描述

输入包含两个整数 x 和 y,表示起始位置和目标位置。

输出描述

输出从 x 到 y 所需的最小步数。


测试样例

样例1:

输入:x_position = 12, y_position = 6
输出:4

样例2:

输入:x_position = 34, y_position = 45
输出:6

样例3:

输入:x_position = 50, y_position = 30
输出:8

样例4:

输入:x_position = 0, y_position = 0
输出:0

问题分析

读完题目之后我们会发现这个步数是一个对称的,而且值呈等差数列,关键是首末步长必须为1这个条件,这里刚开始我想的是使用的暴力的方法一步步将步数减去,但是始终解决不了如何计算最后的步骤是一步还是两步还是不需要走呢?于是,我便向豆包求助了,看完他的提示后,我明白可以利用对称性进行特判就好了,是一个相当巧妙的剪枝操作,下面展示下代码部分

完整源代码

def solution(x_position, y_position):
     
    res = abs(x_position - y_position)
    cnt = 1
    while res > cnt * 2:
        res -= cnt * 2
        cnt += 1
    if res == 0:
        return cnt * 2 - 2
    elif res <= cnt:
        return cnt * 2 - 1
    elif cnt < res <= cnt * 2:
        return cnt * 2
    
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)

代码解释

  1. 计算距离:首先计算从 x_position 到 y_position 的绝对距离 res

  2. 步数计算

    • 使用一个 while 循环来减少 res,直到 res 小于等于 cnt * 2
    • 在每次循环中,res 减去 cnt * 2,并且 cnt 增加 1
  3. 返回步数

    • 如果 res 为 0,返回 cnt * 2 - 2
    • 如果 res 小于等于 cnt,返回 cnt * 2 - 1
    • 如果 cnt 小于 res 且 res 小于等于 cnt * 2,返回 cnt * 2

代码逻辑分析

  1. 计算距离res = abs(x_position - y_position) 计算从 x 到 y 的绝对距离。

  2. 步数计算

    • while res > cnt * 2:当 res 大于 cnt * 2 时,循环继续。
    • res -= cnt * 2:每次循环中,res 减去 cnt * 2
    • cnt += 1:每次循环中,cnt 增加 1
  3. 返回步数

    • if res == 0:如果 res 为 0,返回 cnt * 2 - 2
    • elif res <= cnt:如果 res 小于等于 cnt,返回 cnt * 2 - 1
    • elif cnt < res <= cnt * 2:如果 cnt 小于 res 且 res 小于等于 cnt * 2,返回 cnt * 2