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

77 阅读3分钟

问题描述

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

输入描述

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

输出描述

输出从 xy 所需的最小步数。


测试样例

样例1:

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

老规矩,先问AI

问题分析

  1. 理解移动规则

    • 每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0+1)。
    • 首末两步的步长必须是 1
  2. 目标

    • 计算从 xy 的最少步数。

解题思路

  1. 初始步数

    • 如果 x 等于 y,则不需要移动,步数为 0
  2. 移动模式

    • xy 的移动可以看作是一个逐步接近的过程。
    • 每一步的步长可以是 10-1,但首末两步必须是 1
  3. 步数计算

    • 我们可以通过模拟移动来计算步数。
    • 每一步的步长可以是 10-1,但首末两步必须是 1

寄了,AI似乎没有理解题目逻辑,后面的提示中也同样在此处存在问题,所以本题得靠自己了。 我先简单概述一下题意。 呢 eg. x = 2 , y = 12 ,那么我们可能的一个走步是 2 +1 +2 +3 +2 +1 +1 = 12

这样应该很多人就理解题目了,我们可以 distance = y-x ; 存距离 ,step 存步长。

进一步分析,要想得到最小步数,step 应该是一个先增后减的序列,极限情况下,可以在 step 的峰值停留,即下一步 step +0,(后来我发现这里存在问题)

PS 我好像有了一个绝妙的想法,我就按新的讲吧,错了就当给个思路,旨在启发本文读者,新的思考比旧的解决方案更重要。

我们设上升序列共 rstep 步,此时 step = rstep,这时下降到 1 还需要 rstep-1 步 , 总步数 2 * rstep - 1 ,此时的移动距离为 (1+rstep-1)(rstep-1)/22+rstep , 即 rstep^2, 也就是说

  • dis = 1 ,rstep = 1 ,总步数 1
  • dis = 4 ,rstep = 2 ,总步数 3
  • dis = 9 ,rstep = 3 ,总步数 5
  • dis = 16 ,rstep = 4 ,总步数 7

总步数2n-1 可以覆盖dis 2n-1 ~~ n^2

对于 15 ,14, 我们可以认为 step为峰值时+0,即 +3+4+3 变成+3+3+3 ,+3+3+2

再来看偶数 总步数2 dis 2 总步数4 dis 4-6 总步数6 dis 6-12 总步数8 dis 8-20

总步数2n 可以覆盖到2n ~~ n^2+n

那新方法确实简单了,如下

  public static int solution(int x_position, int y_position) {
        // Please write your code here
        int distance = Math.abs(x_position - y_position);
        int minstep = 0;
        if(distance==0) return 0;
        for (int i = 1;; i++) {
            if (i * i >= distance) {
                minstep = 2 * i - 1;
                break;
            } else if (i * i + i >= distance) {
                minstep = 2 * i;
                break;
            }
        }
        return minstep;
    }