剑指 Offer 15

输入:n = 11 (控制台输入 00000000000000000000000000001011)

输出:3

解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。

示例 2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)

输出:1

解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。

示例 3:

输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)

输出:31

解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

提示:

输入必须是长度为 32 的 二进制串 。

分析

================================================================

n&(n-1)位运算的妙用


在这里插入图片描述

在这里插入图片描述

n - 1操作

无论是借位,还是减1,遇到1就停止;

从低位到高位,一直到1,每一位都发生了反转

&运算符

与运算进行的是这样的算法:

0&0=0,0&1=0,1&0=0,1&1=1

在与运算中两个开关是串联的,如果我们要开灯,需要两个开关都打开灯才会打开。

理解为A与B都打开,则开灯,所以是1&1=1

任意一个开关没打开,都不开灯,所以其他运算都是0

通俗理解为A(与)&B都开则开,否则关

n&(n-1)

通过前两步的简单解释,不难理解最后的&操作,就将之前发生过反转的位都变成0啦,之后就循环 n - 1, n & (n - 1)操作就可以很很简单的计算出二进制位中1的个数。每一次操作,都是遇到1就结束,所以每一次操作都对应有一个1.直到n的所有位都变成了0,说明计算结束。

方法一:逐位判断(执行用时:4 ms 内存消耗:5.3 MB)

=============================================================================================

算法

算法流程:

1.初始化数量统计变量 res = 0。

2.循环逐位判断: 当 n = 0 时跳出。

3. res += n & 1 : 若 n & 1 = 1n&1=1 ,则统计数 resres 加一。

4. n >>= 1 : 将二进制数字 nn 无符号右移一位( Java 中无符号右移为 “>>>>>>” ) 。

返回统计数量 resres 。

int hammingWeight(uint32_t n) {

int ret=0;

while(n>0){

ret+=n&1;

n>>=1;

}

return ret;

}

在这里插入图片描述

方法二:位运算优化(执行用时:0 ms 内存消耗:5.3 MB)

==============================================================================================

就是利用我上面写的分析n&(n-1)

int hammingWeight(uint32_t n) {

int ret=0;

while(n!=0){

ret++;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-o0F3tLWN-1712907525776)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值