题目描述
小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:
1.数轴上向前走一步,即n=n+1
2.数轴上向后走一步,即n=n-1
3.数轴上使劲跳跃到当前点的两倍,即n=2*n
现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?
输入描述:
小招喵想去的位置x
输出描述:
小招喵最少需要的步数
输入例子1:
3
输出例子1:
3
输入例子2:
1980
输出例子2:
14
思路-递归
设小招喵要去的位置为x,最小的步数为f(x),则f(x)满足如下关系:
1.f(0) = 0;
2.f(1) = 1;
且f(x)存在如下递推关系:
当x为偶数时,f(x) = f(x/2)+1;
当x为奇数时,f(x) = min(f((x-1)/2),f((x+1)/2))+2;
此外,还需考虑到x为负数的情况,转化为整数即可。
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int n1 = (n>=0)?n:(0-n);
System.out.print(minJump(n1));
}
private static int minJump(int n){
if(n == 0) return 0;
if(n == 1) return 1;
if((n & 1) == 0){
return 1+minJump(n >> 1);
}else{
return 2+Math.min(minJump(n >> 1),minJump((n+1) >> 1));
}
}
}