坏了的计算器
在显示着数字的坏计算器上,我们可以执行以下两种操作:
- 双倍(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 次
解题思路:首先看到这个题目感觉不难,然后分情况去解题,只有 x2和 -1的操作,
1.X>=Y 只有一直递减,所以结果为 X-Y,
2.X<Y 我首先想到的是用X/Y然后和2的n次去比较,然后使用了下,会出现最小公约数的问题,然后就没想到循环去解决。
因为我只判断了第一次是否为奇数,只有第一次加一,所以有问题,然后看了下题解,才想到应该放到循环里面。
最后题解
class Solution {
public int brokenCalc(int X, int Y) {
if(X >= Y){
return X-Y;
}
int num = 0;
while(X < Y) {
if(Y % 2 == 1) {
Y++;
} else {
Y /= 2;
}
num++;
}
num += X - Y;
return num;
}
}
我的第一次
public static int brokenCalc(int X, int Y) {
if(X >= Y){
return X-Y;
}
int p = 0;
int m = Y %2;
if(m == 1){
Y =Y +1;
p++;
}
int t = Y / X;
int q = 0;
while(true){
if( t >= (2 * q) && t <= 2 *(q + 1)){
return q +1 + p + (t- 2 *q);
}
q++;
}
}
浙公网安备 33010602011771号