[Leetcode学习-java]Number of Steps to Reduce a Number to Zero(将整数处理为0)

问题:

难度:easy

说明:

给出一个 int 整形 a,如果 a 是偶数,就将 a / 2,如果是奇数就将 a - 1,一直处理到 int a = 0

问题链接:https://leetcode.com/problems/number-of-steps-to-reduce-a-number-to-zero/

输入范围:

a 为 正整数 , a < Integer.MAX_VALUE。

输入案例:

// 14偶数:14 / 2 = 7
// 7奇数:7 - 1 = 6
// 6偶数:6 / 2 = 3
// 3奇数:3 - 1 = 2
// 2偶数:2 / 2 = 1
// 1奇数:1 - 1 = 0
// 一共 6 步

Input: num = 14
Output: 6
Explanation: 
Step 1) 14 is even; divide by 2 and obtain 7. 
Step 2) 7 is odd; subtract 1 and obtain 6.
Step 3) 6 is even; divide by 2 and obtain 3. 
Step 4) 3 is odd; subtract 1 and obtain 2. 
Step 5) 2 is even; divide by 2 and obtain 1. 
Step 6) 1 is odd; subtract 1 and obtain 0.

我的代码:

很简单的题,不过如果要尽量快,可以用位运算。

比如:14 二进制为 1 1 1 0

那么 1 1 1 0 是 0 结尾, 14 >> 1 = 1 1 1,需要 1 次操作。

1 1 1 是 1 结尾,1 1 1 - 1 = 1 1 0, 1 1 0 >> 1 = 11 需要 2 次操作。

可以发现,如果 0 结尾,去掉尾部 1 此操作,1 结尾 去掉尾部 2 次操作。如果 1 是整形的头部,就需要 1 次 操作。

因此 14 = 1 1 1 0 = 1 + 2 * 2 + 1 = 6 次操作

class Solution {
    public int numberOfSteps (int num) {
        // 少于 3 的都可以不处理
        if(num < 3) return num;
        int step = 0;
        while(num != 0) {
            step ++;
            // & 操作 相当于尾部 1 & 1 = 1; 0 & 1 = 0,相当于判断是否增加操作步数
            step += num & 1;
            // 除 2 快速操作
            num >>= 1;
        }

        // 最后都要排除 头部 多出一次操作
        return step - 1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28033719/article/details/107205552