題目描述
小招喵喜歡在數軸上跑來跑去,假設它現在站在點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));
}
}
}