E.位运算-基础——1342. 将数字变成 0 的操作次数
·
题目链接: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;
}
}
更多推荐

所有评论(0)