题目描述:
在显示着数字的坏计算器上,我们可以执行以下两种操作:
双倍(Double):将显示屏上的数字乘 2;
递减(Decrement):将显示屏上的数字减 1 。
最初,计算器显示数字 X。
返回显示数字 Y 所需的最小操作数。
示例 1:
输入:X = 2, Y = 3
输出:2
解释:先进行双倍运算,然后再进行递减运算 {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
解释:执行递减运算 1023 次
提示:
1 <= X <= 10^9
1 <= Y <= 10^9
这道题一开始打算使用递归的,但是没成功,哎
但是我想到了既然X到Y是-1 2,因为2是随时可以的,那么可以转换成/2 和+1,因为/2不是随时可以的,并且/2是正确的方向,如果x=3,y=7,那么肯定是先+1然后除以2然后再除以2然后加一,但是自己当时没往深了想,以为也是一样复杂的,哎
代码如下:
class Solution {
public int brokenCalc(int X, int Y) {
int result = 0;
if(X == Y){
return 0;
}
while (X != Y) {
if(X < Y){
if(Y % 2 == 0){
Y = Y/2;
result ++;
}else {
Y++;
result ++;
}
}else {
result += (X - Y);
X = Y;
}
}
return result;
}
}
知道了思路就很简单,如果不知道思路就会很复杂,而且还弄不出来,哎