坏了的计算器
在显示着数字的坏计算器上,我们可以执行以下两种操作:
- 双倍(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++; } }