1342. 将数字变成 0 的操作次数『简单』

题目来源于力扣(LeetCode

一、题目

1342. 将数字变成 0 的操作次数

题目相关标签:位运算

提示:

0 <= num <= 10^6

二、解题思路

2.1 位运算方式

  1. 找规律:数字的二进制形式中 (位数 + 1 的个数)- 1

    减 1 是因为最后一位二进制位 1 变成 0 后不需要再进行右移位的操作了,因为最后一位二进制位 1 变成 0 后,该数值已经为 0

2.2 递归方式

  1. 根据题目提示来模拟实现

  2. 递归方式来用代码代替文字表达

  3. 为偶数时,除 2 操作

  4. 为奇数时,减 1 操作

  5. 最后为零时,返回零,结束递归

三、代码实现

3.1 位运算方式

public static int numberOfSteps(int num) {
    if (num == 0) {
        return 0;
    }
    int count = 0;
    while (num > 0) {
        if ((num & 1) == 1) {
            // 位为 1 时需要加 1(步操作)
            count++;
        }
        num >>= 1;
        // 右移位时需要加 1(步操作)
        count++;
    }
    // 因为最后只剩 1 位时,从 1 变成 0 只需 1 次,而无需再进行一次移位操作了
    return count - 1;
}

3.2 递归方式

public static int numberOfSteps(int num) {
    if (num == 0) {
        return 0;
    }
    if (num % 2 == 1) {
        // 为奇数时,减 1 操作
        return 1 + numberOfSteps(num - 1);
    } else {
        // 为偶数时,除 2 操作
        return 1 + numberOfSteps(num / 2);
    }
}

四、执行用时

4.1 位运算方式

4.2 递归方式

五、部分测试用例

public static void main(String[] args) {
//        int num = 14;  // output:6
//        int num = 8;  // output:4
    int num = 123;  // output:12
//        int num = 0;  // output:0
//        int num = 1;  // output:1
        int result = numberOfSteps(num);
    System.out.println(result);
}
posted @ 2020-05-11 23:51  知音12138  阅读(359)  评论(0编辑  收藏  举报