问题描述:
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 步。
解决方案
-
计算距离:首先计算 x 和 y 之间的绝对距离 d = |x - y|。
-
处理特殊情况:对于一些特殊情况,我们可以直接给出答案:
-
如果 d == 0,即 x == y,我们需要走 0 步(不用走)。 -
如果 d == 1,即 x 和 y 之间的距离是 1,我们只需要 1 步。 -
如果 d == 2,即 x 和 y 之间的距离是 2,我们需要 2 步。 -
如果 d == 3,即 x 和 y 之间的距离是 3,我们需要 3 步。 -
一般情况:其实我们分析一下题目可以发现,如果追求最短步骤,不可能会出现走“回头路”这一现象的,比如我先前进3步又后退两步,所以我只会一直前进或者一直后退,在这里我们取了距离的绝对值不妨假设到达终点需要一直前进。
首先开头和结尾的步长必是1
如果我们中间走一步,我们最大只能走 1 2 1这种情况,总距离<=4,那么一共只需要走1+2步就可以!
如果我们中间走两步,我们最大只能走 1 2 2 1 这种情况,总距离大于4小于等于7,一共只需要4步即可!
聪明的你已经发现:
如果中间只能走3步,那么最大的序列是1 2 3 2 1
如果中间只能走4步,那么最大的序列是1 2 3 3 2 1
…
所以我们只要知道距离并且知道它位于第几步到第几步的区间我们就直接能判别最少需要几步即可!
代码实现
public class Main {
public static int solution(int xPosition, int yPosition) {
// Please write your code here
int d = Math.abs(xPosition-yPosition);
if(d == 0) return 0;
else if(d == 1) return 1;
else if(d == 2) return 2;
else{
int step = 3;
int maxdistance = 4;
while (d > maxdistance) {
step++;
maxdistance = maxdistance +(step-1)/2+1;
}
return step;
}
}
public static void main(String[] args) {
// You can add more test cases here
System.out.println(solution(12, 6) == 4);
System.out.println(solution(34, 45) == 6);
System.out.println(solution(50, 30) == 8);
}
}