青训营X豆包MarsCode 技术训练营 AI刷题39. 计算从位置 x 到 y 的最少步数 | 豆包MarsCode AI 刷题

57 阅读3分钟

image.png

  1. #include 
  2. using namespace std;
  3. int solution(int xPosition, int yPosition) {
  4.     //数学方法 找规律 求解
  5.     int l = abs(xPosition-yPosition); //绝对距离
  6.     int i = 0;  //到底所需的当前步数
  7.     int k = 0;  //可活动步数
  8.     while(true){
  9.         k+=(i+1)/2;;
  10.         if(l<=k) return i;
  11.         i++;
  12.     }
  13. }
  14. int main() {
  15.     //  You can add more test cases here
  16.     cout << (solution(12, 6) == 4) << endl;
  17.     cout << (solution(34, 45) == 6) << endl;
  18.     cout << (solution(50, 30) == 8) << endl;
  19.     return 0;
  20. }

image.png

题目解析

  1. 位置的变化:

    • 你从位置 x 出发,目标是到达位置 y
    • 每一步的移动是有限制的:上一步的步长可以减小 1,不变 0,或增加 1
    • 首末两步的步长必须是 1,意味着从 x 到 y 的第一步和最后一步的步长一定是 1。
  2. 步长递增:

    • 每一步的步长是可以逐渐变化的,但每一步的步长要满足连续整数的条件。
    • 比如第一步可以走 1,第二步可以走 1 或 2,第三步可以走 2 或 3,依此类推。
  3. 问题本质:

    • 我们的问题本质是:通过一系列连续变化的步长从 x 到 y,找到最小的步数。

步骤和策略

  1. 最小步数的计算:

    • 首先,计算出目标位置 y 和起始位置 x 之间的距离,即 distance = |y - x|。如果 distance == 0,意味着起点和终点相同,步数是 0。
  2. 步长递增的规律:

    • 由于每步的步长是一个递增的连续整数,步长可以从 1 开始,然后逐步增加。每一步的步长必须是上一步的 -10 或 +1,且首末两步的步长固定为 1。
  3. 思路:

    • 假设我们已经走了 k 步,且当前已移动的总距离是 S。每一步的步长是递增的,即第 i 步的步长是 i。我们需要找到一个最小的 k,使得走完的总步长大于或等于 distance
  4. 总结规律:

    • 可以从 1 开始步进,逐步增加步长,并累计已走的距离。当累计的距离超过或等于目标 distance 时,我们即找到了最小的步数。

解题步骤

  1. 计算 distance = |y - x|
  2. 逐步增加步长,直到累计的步长大于或等于 distance
  3. 输出需要的最小步数。

我的代码的核心逻辑是:

  1. 计算起始和目标之间的距离 l
  2. 每次增加步数,步长是 (i + 1) / 2,并将其累加到总距离 k 中。
  3. 一旦 k 达到或超过 l,返回当前步数 i

3. 累加步长并检查是否满足条件

while(true){ k += (i + 1) / 2; // 累加步长 if (l <= k) return i; // 如果已经足够距离,返回步数 i++; // 增加步数 }

  • k += (i + 1) / 2;:每次你累加 i + 1 的一半到总距离 k。这意味着你每次累加的步长并不是逐步增加的整数值,而是 (i + 1) / 2。因此,每步的实际增加量并非预期的递增步长,而是对 i 的处理。
  • if (l <= k) return i;:当 k 已经足够覆盖目标距离 l 时,返回当前的步数 i
  • i++:步数递增,继续进行下一轮计算。