给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
进阶:
- 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
- 要求算法的空间复杂度为O(n)。
- 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。
代码:
class Solution:
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
res = []
for i in range(num):
count = 0
while i:
i = i & (i - 1)
count += 1
res.append(count)
return res
总结:
利用位运算 i = i & (i - 1) 来清除i的二进制中最后位的1
优化时间复杂度:
class Solution:
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
res = [0]*(num+1)
for i in range(1,num+1):
res[i] += res[i & (i - 1)] + 1
return res
总结一些位运算的实用操作:
- x & 1 == 1 or == 0 判断奇偶 x %2 == 1 or == 0
- x = x &(x - 1) 清零最低位的1
- x & -x 得到最低位的1
异或操作的6种特点:
- x ^ 0 = x
- x ^ 1s = ~x // 1s == ~0
- x ^ (~x) = 1s
- x ^ x =0
- a ^ b = c --> a ^ c = b , b ^ c = a //swap
- a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c //associative
更为复杂的7种位运算操作:(了解即可)
- 将x最右边的n位清零:x & (~0 << n)
- 获取x的第n位值(0或1):(x >> n) & 1
- 获取x的第n位的幂值:x & (1 << (n-1))
- 仅将第n位置的为1:x | (1 << n)
- 仅将第n位置的为0:x & (~(1 << n))
- 将x最高位至第n位(含)清零:x & ((1 << n) - 1)
- 将第n位至第0位(含)清零:x & (~((1 << (n + 1)) - 1))
来源:CSDN
作者:Aries888
链接:https://blog.csdn.net/qq_38575545/article/details/86005192