题目链接:1342. 将数字变成 0 的操作次数(简单)

算法原理:

解法一:模拟

0ms击败100.00%

时间复杂度O(Logn)

思路很简单暴力,只要num不为0就持续操作,偶数÷2,奇数-1

解法二:位运算 

0ms击败100.00%

时间复杂度O(1)

举个例子,二进制数为11001,所有在最低位的1都会通过-1的方式去掉,在最低位的0都会通过÷2的方式去掉,因此我们只需计算这两种方式的总和,即为结果

对于偶数,直接÷2,也就是>>1位,次数+1

对于奇数,先-1,当最低位为0时变成偶数,再>>1位,总次数+2

因此我们需要计算二进制中>>的位数和1的个数

需要>>的位数=总有效位数-1(最高位一定为1,不用>>了)

=32-Integer.numberOfLeadingZeros(num)-1

1的个数=Integer.bitCount(num)

二者的和即为结果

细节:当num为0时,会错误的返回-1,因此返回前先判断num是否为0

Java代码:

class Solution {
    //解法一:模拟
    public int numberOfSteps(int num) {
        int cnt=0;
        while(num!=0){
            if(num%2==0) num/=2;
            else num--;
            cnt++;
        }
        return cnt;
    }
}
class Solution {
    //解法二:位运算
    public int numberOfSteps(int num) {
        return num==0?0:32-Integer.numberOfLeadingZeros(num)+Integer.bitCount(num)-1;
    }
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐