01.计算从位置 x 到 y 的最少步数 | 豆包MarsCode AI 刷题

71 阅读2分钟

本题题目为

计算从位置 x 到 y 的最少步数

问题描述

小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. 计算距离:首先计算从 x 到 y 的绝对距离 des = abs(y - x)

  2. 步数计算

    • 如果 des 小于 2,直接返回 0,因为不需要移动。
    • 否则,我们需要找到一个步数 n,使得从 1 到 n 的步长之和(即 1 + 2 + 3 + ... + n)能够覆盖或超过 des
    • 由于首末步长为 1,实际步数会比 n 多 2 步(首尾各一步)。

解答: def solution(x_position, y_position): des = abs(y_position - x_position) i = 1 sum = 1 res = [1,1]

# 检查距离是否有用
if des < 2 :
    return 0

while(True):
    i += 1
    sum = i * (i + 1) // 2
    # sum * 2 小于des,继续循环,增加步数
    if(sum * 2 < des):
        res.extend([i, i])
    # sum * 2 恰好等于des 结束循环
    elif sum * 2 == des:
        res.extend([i, i])
        break
    else:
        if des <= (sum * 2 - i):
            res.append(des - (sum - i) * 2)
            break
        else:
            res.extend([sum - i, des - (sum * 2 - i)])
            break

#print(res)
return len(res)

这个题目本身难度是不高的,我直接通过思考也将这个题目写了出来。但是AI的解题思路更加清晰也更加简洁。我们首先计算从 x 到 y 的绝对距离 des = abs(y_position - x_position)。 当然,也有特殊情况需要处理:如果 des 小于 2,直接返回 0,因为不需要移动。 再初始化变量:初始化步数 i 为 1。 初始化步长和 sum 为 1(因为第一步的步长为 1)。 计算循环计算步长和: 使用循环计算步长和 sum,直到 sum 大于或等于 des。 每次循环中,步数 i 增加 1,步长和 sum 增加 i。 最后调整步数: 如果 sum 恰好等于 des,说明步长和刚好覆盖了距离,返回 i + 1(加上首尾两步)。 如果 sum 大于 des,说明步长和超过了距离,返回 i + 2(加上首尾两步,并调整中间步数)。

完成以上步骤之后,点击运行,检查测试样例

image.png 发现全部"True" 点击提交

image.png 通过!