刷题打卡,LeetCode每日一题,冲!
2023-10-19 05:25:05
大家好,欢迎来到我的LeetCode每日一题专栏!我是你们的刷题小助手,每天在这里陪大家一起刷题,提升算法技能。
今天我们要挑战的是 LeetCode 338. 比特位计数。这道题是Medium难度,考察了位运算和数组操作的基本知识。
题目要求我们给定一个非负整数 num,对于 0 ≤ i ≤ num 范围内的每个数字 i,计算其二进制数中的 1 的数目,并将其作为数组返回。
乍一看,这道题似乎有点复杂,但其实只要我们掌握了位运算和数组的基本概念,就可以轻松搞定它。
位运算
位运算是一种在二进制层面对数字进行操作的特殊操作。常用的位运算符有:
- 按位与(&):如果两个二进制位都为 1,结果为 1,否则为 0。
- 按位或(|):如果两个二进制位中有一个为 1,结果为 1,否则为 0。
- 按位异或(^):如果两个二进制位不同,结果为 1,否则为 0。
- 左移(<<):将一个二进制数向左移动 n 位,相当于乘以 2^n。
- 右移(>>):将一个二进制数向右移动 n 位,相当于除以 2^n。
算法思路
这道题的关键在于如何快速计算一个数字二进制数中的 1 的个数。我们可以利用位运算中的一个巧妙技巧:
每次将数字与 1 进行按位与运算,如果结果为 1,则说明该数字的二进制表示中最后一位是 1,将其计数加 1,然后将数字右移一位,重复该操作,直到数字变为 0。
以下是用 Python 实现的算法:
def count_bits(num):
count = 0
while num > 0:
if num & 1 == 1:
count += 1
num >>= 1
return count
复杂度分析
时间复杂度:O(sizeof(integer)),其中 sizeof(integer) 是存储整数所需的位数。由于我们对每个数字执行常数次位运算,因此算法的时间复杂度与整数的位数成正比。
空间复杂度:O(1),因为我们只需要存储一个计数器变量。
举例说明
例如,对于数字 5,其二进制表示为 101。
- 5 & 1 = 1,计数加 1,5 右移一位得到 2。
- 2 & 1 = 0,计数不变,2 右移一位得到 1。
- 1 & 1 = 1,计数加 1,1 右移一位得到 0。
- 0 & 1 = 0,结束循环。
因此,5 的二进制表示中包含 2 个 1,返回 [0, 1, 1, 2, 1]。
总结
LeetCode 338. 比特位计数这道题虽然乍一看有点复杂,但只要我们掌握了位运算和数组的基本概念,就可以轻松搞定它。通过这道题,我们不仅锻炼了算法技能,还加深了对位运算的理解。
刷题打卡,每天进步一点,期待你们在评论区分享你们的刷题心得和遇到的难题。让我们一起在算法的道路上不断成长,成为编程高手!