「LeetCode系列」比特位计数问题|刷题打卡

137 阅读3分钟

作者:看那个码农

公众号:看那个码农

本题来源于「LeetCode系列」338.比特位计数

题目描述:

给定一个非负整数num。

对于0≤i≤num范围中的每个数字i,计算其二进制数中的1的数目并将它们作为数组返回。

示例:
输入: 2
输出: [0,1,1]

解释

十进制012三个数的二进制数分别为
00000 含有01
10001 含有11
20010 含有11
因此输出为011

输入: 7

输出: [0,1,1,2,1,2,2,3]

解释:
十进制0,1,2,3,4,5,6,7八个数的二进制数分别为
00000 含有01
10001 含有11
20010 含有11
30011 含有21
40100 含有11
50101 含有21
60110 含有21
70111 含有31
因此输出为01121223

代码分析

由题目描述可知

设f(x)为x二进制中1的个数

f(3)=2
3的二进制表达式为0011,故二进制中1的个数为2

1.如果输入i为偶数,那么f(i)=f(i//2),因为i//2本质上是i的二进制右移一位,高位补零,所以1的数量不变。

4, 6, 84的二进制为01002的二进制为0010
f(4)=1=f(2)

6的二进制为01103的二进制为0011
f(6)=2=f(3)

8的二进制为10004的二进制为0100
f(8)=1=f(4)

2.如果输入i为奇数,那么f(i)=f(i-1)+1,i为奇数时,i-1必定为偶数,而偶数的二进制最低位一定是0, 那么该偶数二进制加1后的二进制最低位变为1且不会进位,所以奇数二进制中1的个数比它上一个偶数二进制中1的个数多一个1, 即f(i)=f(i-1)+1。

3, 5, 7, 93的二进制为00113-1=2的二进制为0010
f(3)=f(2)+1=1+1=2

5的二进制为01014的二进制为0100
f(5)=f(4)+1=1+1=2

7的二进制为01116的二进制为0110
f(7)=f(6)+1=2+1=3

9的二进制为01018的二进制为0100
f(9)=f(8)+1=1+1=2

所以代码为:

class Solution:
    def countBits(self, num: int) -> List[int]:
        res=[0]
        for i in range(1,num+1):
            if i%2==0:
                res.append(res[i//2])
            else:
                res.append(res[i-1]+1)
        return res

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情