辉乾

坏了的计算器

在显示着数字的坏计算器上,我们可以执行以下两种操作:

  • 双倍(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++;
            }

        }

  

posted on 2019-05-02 16:54  辉乾  阅读(384)  评论(0编辑  收藏  举报