(易)计算从位置x到y的最少步数 问题描述 小F正在进行一个 AB 实验,需要从整数位置x移动到整数位置y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的-1,+0或+1)。首末两步的步长必须是1。求从x到y的最少步数。 输入描述 输入包含两个整数x和y,表示起始位置和目标位置。 输出描述 输出从x到y所需的最小步数。 测试样例
样例1: 输入:x p o s i t i o n = 12 , y p o s i t i o n = 6 x_position = 12, y_position = 6x p osition=12,y p osition=6 输出:4
样例2: 输入:x p o s i t i o n = 34 , y p o s i t i o n = 45 x_position = 34, y_position = 45x p osition=34,y p osition=45 输出:6
样例3: 输入:x p o s i t i o n = 50 , y p o s i t i o n = 30 x_position = 50, y_position = 30x p osition=50,y p osition=30 输出:8
样例4: 输入:x p o s i t i o n = 0 , y p o s i t i o n = 0 x_position = 0, y_position = 0x p osition=0,y p osition=0 输出:0
解题思路 这个思路似乎不太一样,我们来看,题目有两个关键要求:一个是步数最少,一个是相邻两步之间只能是+1,-1,+0三种情况。 那我们以 1 、 2 、 3 、 4 、 3 、 2 、 1 1、2、3、4、3、2、1 1、2、3、4、3、2、1 为例,此时的距离是16;而 1 、 2 、 3 、 4 、 5 、 4 、 3 、 2 、 1 1、2、3、4、5、4、3、2、1 1、2、3、4、5、4、3、2、1 时,此时的距离是25;先得出一个小规律,这样的分布总距离是n ∗ n n*nn∗n(n是最中间的那个数)。 然后呢,我们假设目标距离是20,那是不是只要在第一个数列中间添加一个4,也就是: 1 、 2 、 3 、 4 、 4 、 3 、 2 、 1 1、2、3、4、4、3、2、1 1、2、3、4、4、3、2、1 ,那么最少步数就是8。 那20和25之间还有一段距离,如果目标距离在这一段呢,我们可以在第三个数列的基础上继续添加,那就有疑问了:为什么不是第二个呢?这就涉及到第二个限制条件:相邻两步之间只能是+1,-1,+0,当你的这一组数列中出现5时,5的左右两侧至少各有1个4,符合限制的最短距离和就是25,超出了。所以呢,假设目标距离是23,那么也就是在第三个数组的基础上再插入一个3,也就是: 1 、 2 、 3 、 4 、 4 、 3 、 3 、 2 、 1 1、2、3、4、4、3、3、2、1 1、2、3、4、4、3、3、2、1 此时的最少步数是9。 此外,还有一种特殊情况:如果两个位置之间的距离是0,那么我们原本思路的对n进行微操似乎就不太合适,那我们就在方法最开始的位置填上一个判断条件,如果距离是0,那么直接返回0即可。
public class Main {
public static int solution(int xPosition, int yPosition) {
int len = Math.abs(yPosition-xPosition);
if(len==0){
return 0;
}
int n=0;
do {
n++;
}while(n*n<=len);
n--;
if(len-n*n==0){
return n+n-1;
}else if(len-n*n<=n){
return n*2;
}else{
return n*2+1;
}
}
public static void main(String[] args) {
// You can add more test cases here
System.out.println(solution(12, 18) == 4);
System.out.println(solution(34, 45) == 6);
System.out.println(solution(50, 30) == 8);
System.out.println(solution(50, 27) == 9);
System.out.println(solution(50, 35) == 7);
}
}