小招喵跑步[java]

題目描述

小招喵喜歡在數軸上跑來跑去,假設它現在站在點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));
	        }
	    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章