图解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^)/ ~ 「干货分享,每天更新」

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