图解LeetCode——剑指 Offer 15. 二进制中1的个数

简介: 图解LeetCode算法

一、题目

  • 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量)。

二、示例

2.1> 示例 1:

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

输出】3

解释】输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'

2.2> 示例 2:

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

输出】1

解释】输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'

2.3> 示例 3:

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

输出】31

解释】输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'

提示:

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

三、解题思路

3.1> 思路1:

  • 根据题意,我们需要找出某个int类型数字中二进制1的个数,那么首先我们可以通过创建一个变量bit,其初始值为0,它表示向左移动的位数,即:1 << bit;那么就有如下结果:

当bit=0时】1 << bit等于1 << 0,即:00001

当bit=1时】1 << bit等于1 << 1, 即:00010

当bit=2时】1 << bit等于1 << 2,即:00100

当bit=3时】1 << bit等于1 << 3,即:01000

以此类推……

  • 那么我们可以根据以上的1 << bit (bit自增到31),并且与int类型的数字执行按位与操作,那么就可以校验32位中每一位是否为1了。好了,解题思路并不复杂,那么下面我们还是按照惯例,以找出二进制0101110有多少个1为例,看一下具体的计算过程。请见下图所示:

3.2> 思路2:

  • 在思路1中,我们是创建了bit变量,然后通过移动bit来进行每一位是否为1的判断的。那么,我们也可以通过移动这个int类型的数字,去跟固定的1执行按位与操作,那么也是可以计算出某个int类型数字中二进制1的个数。具体的操作详情我就不在这里追溯了,我们来看下图,里面已经画出了详细的处理过程。

四、代码实现

4.1> 实现1:

publicclassSolution {
publicinthammingWeight(intn) {
intresult=0, bit=0;
while (bit++<32) 
if ((n& (1<<bit)) !=0) result++;
returnresult;
    }
}

4.2> 实现2:

publicclassSolution {
publicinthammingWeight(intn) {
intresult=0, bit=32;
while (bit-->=0) {
if ((n&1) ==1) result++;
n>>>=1;
        }
returnresult;
    }
}


今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
57 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 49. 丑数
解决剑指 Offer 49题"丑数"的Python实现,通过动态规划的方法计算出第n个丑数。
46 2
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 04. 二维数组中的查找
剑指Offer题目 "二维数组中的查找" 的Python解决方案,包括非递归迭代、递归以及使用内置函数的二分查找方法,以判断一个有序的二维数组中是否含有给定整数。
39 1
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 03. 数组中重复的数字
解决剑指Offer题目 "数组中重复的数字" 的Python实现方法,通过使用字典来记录数组中每个数字的出现次数,快速找出重复的数字。
43 1
|
4月前
|
iOS开发 MacOS
【Mac系统】解决Vscode中LeetCode插件不能刷剑指offer题库
文章讨论了解决Mac系统中Vscode里LeetCode插件无法刷剑指Offer题库的问题,并提供了一些相关的使用技巧和资源链接。
258 1
|
4月前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
58 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
35 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
29 4