題目
(https://leetcode-cn.com/problems/broken-calculator/)
在顯示著數(shù)字的壞計(jì)算器上删铃,我們可以執(zhí)行以下兩種操作:
雙倍(Double):將顯示屏上的數(shù)字乘 2煞檩;
遞減(Decrement):將顯示屏上的數(shù)字減 1 制市。
最初残拐,計(jì)算器顯示數(shù)字 X。
返回顯示數(shù)字 Y 所需的最小操作數(shù)桌吃。
示例 1:
輸入:X = 2, Y = 3
輸出:2
解釋:先進(jìn)行雙倍運(yùn)算标沪,然后再進(jìn)行遞減運(yùn)算 {2 -> 4 -> 3}.
示例 2:
輸入:X = 5, Y = 8
輸出:2
解釋:先遞減榄攀,再雙倍 {5 -> 4 -> 8}.
示例 3:
輸入:X = 3, Y = 10
輸出:3
解釋:先雙倍,然后遞減金句,再雙倍 {3 -> 6 -> 5 -> 10}.
示例 4:
輸入:X = 1024, Y = 1
輸出:1023
解釋:執(zhí)行遞減運(yùn)算 1023 次
提示:
1 <= X <= 10^9
1 <= Y <= 10^9
分析
從Y開始分析檩赢。分析Y如何變成X,倒過來思路
首先理解一個(gè)算法 假如a為偶數(shù)
(a+1+1)/2=a/2+1
意思就是违寞,如果一個(gè)數(shù)為偶數(shù)贞瞒。那么他先加在除以2的計(jì)算次數(shù)永遠(yuǎn)比除以2再加一多一次
首先分類討論。如果Y<=X,則直接返回X-Y
如果Y>X
如果Y為基數(shù) Y++坞靶,然后再Y/2(一直除以到 Y<X)
然后再Y++(一直加到X==Y)
代碼
class Solution {
public int brokenCalc(int X, int Y) {
int account = 0;
if (Y<=X){
account = X-Y;
return account;
}
while (Y>X){
if (Y%2!=0){
Y++;
account++;
}
Y = Y/2;
account++;
}
account = account+ X-Y;
return account;
}
}