首页 > 其他分享 >图解LeetCode——剑指 Offer 15. 二进制中1的个数

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

时间:2023-05-23 11:03:08浏览次数:32  
标签:15 Offer int 示例 二进制 result bit 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为例,看一下具体的计算过程。请见下图所示:

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

3.2> 思路2:

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

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

四、代码实现

4.1> 实现1:

public class Solution {
    public int hammingWeight(int n) {
        int result = 0, bit = 0;
        while (bit++ < 32) 
            if ((n & (1 << bit)) != 0) result++;
        return result;
    }
}

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

4.2> 实现2:

public class Solution {
    public int hammingWeight(int n) {
        int result = 0, bit = 32;
        while (bit-- >= 0) {
            if ((n & 1) == 1) result++;
            n >>>= 1;
        }
        return result;
    }
}

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

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

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

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

标签:15,Offer,int,示例,二进制,result,bit,LeetCode,输入
From: https://blog.51cto.com/u_15003301/6330121

相关文章

  • 图解LeetCode——654. 最大二叉树(难度:中等)
    一、题目给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:1>创建一个根节点,其值为 nums中的最大值。2>递归地在最大值 左边 的 子数组前缀上 构建左子树。3>递归地在最大值右边的 子数组后缀上 构建右子树。返回 nums构建的......
  • 图解LeetCode——1224. 最大相等频率(难度:困难)
    一、题目给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回该前缀的长度:从前缀中恰好删除一个元素后,剩下每个数字的出现次数都相同。如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是0次)。二、示例2.1>示例1:【......
  • 图解LeetCode——769. 最多能完成排序的块(难度:中等)
    一、题目给定一个长度为n的整数数组arr,它表示在[0,n-1]范围内的整数的排列。我们将arr分割成若干块(即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。返回数组能分成的最多块数量。二、示例2.1>示例1:【输入】arr=[4,3,2,......
  • 图解LeetCode——940. 不同的子序列 II(难度:困难)
    一、题目给定一个字符串s,计算s的不同非空子序列的个数。因为结果可能很大,所以返回答案需要对10^9+7取余。字符串的子序列是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。例如:"ace"是"abcde"的一个子序列,但"aec"不是。二、示例2.......
  • 图解LeetCode——1441. 用栈操作构建数组(难度:中等)
    一、题目给你一个数组target和一个整数n。每次迭代,需要从 list={1,2,3...,n}中依次读取一个数字。请使用下述操作来构建目标数组target:"Push":从list中读取一个新元素,并将其推入数组中。"Pop":删除数组中的最后一个元素。如果目标数组构建完成,就停止读取更多元......
  • 图解LeetCode——886. 可能的二分法(难度:中等)
    一、题目给定一组 n 人(编号为 1,2,...,n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n 和数组dislikes ,其中 dislikes[i]=[ai,bi] ,表示不允许将编号为ai 和  bi的人归入同一组。当可以用这种方法将所有人......
  • 图解LeetCode——827. 最大人工岛(难度:困难)
    给你一个大小为nxn二进制矩阵grid。最多只能将一格 0变成 1。返回执行此操作后,grid中最大的岛屿面积是多少?岛屿由一组上、下、左、右四个方向相连的 1形成。二、示例2.1>示例1:【输入】grid=[[1,0],[0,1]]【输出】3【解释】将一格0变成1,最终连通两个小......
  • 图解LeetCode——904. 水果成篮(难度:中等)
    一、题目你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果种类。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有两个篮子,并且每个篮子只能装单一类型的水果......
  • 代码随想录算法训练营第11天 | ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重
     第五章 栈与队列part02今日内容:  ●  20. 有效的括号●  1047. 删除字符串中的所有相邻重复项●  150. 逆波兰表达式求值  详细布置   20. 有效的括号  讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。  大家先自己思考一下 有......
  • 5.15-5.21
    D.ProductiveMeeting贪心,STLProblem-D-Codeforces题意:​ 一共有n个人,每个人最多可以跟其他人交谈\(s_i\)次,问最多能让所有人交谈多少次。思路:​ 一眼看出贪心,但在怎么贪的问题上出了问题。​ 一开始的想法是排序找到能跟他人交谈次数最多的那个人,优先满足他的所有交......