【leetcode刷题】32.二进制中1的个数——Java版

简介: ⭐欢迎订阅《leetcode》专栏,每日一题,每天进步⭐把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。——leetcode此题热评

7b6b0b32d09cb6c250cdb614723073a0.png前言

哈喽,大家好,我是一条。


糊涂算法,难得糊涂


面试陌陌时遇到的一道题


Question

剑指 Offer 15. 二进制中1的个数

难度:简单


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


提示:


请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。

在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。


示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例3:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

提示:


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


Solution

又是一道可以巧妙的用位运算解决的问题。


(n−1) : 二进制数字 nn 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。

n & (n - 1): 二进制数字 n 最右边的 1 变成 00 ,其余不变。

e0a5c8873e254bd28f88ce5fa3da9e2f.png

  • 通过与运算不断消去右边的1
  • 统计进行与运算的次数
  • 当 n = 0 时结束

Code

所有leetcode代码已同步至github

欢迎star

/**
 * @author yitiaoIT
 */
public class Solution {
    public int hammingWeight(int n) {
        int sum = 0;
        while(n != 0) {
            sum++;
            n &= n - 1;
        }
        return sum;
    }
}

Result

复杂度分析

  • 时间复杂度:O(N)

e10f65516b08abceada8d9e1a6f86f47.png

🌈寻宝

⭐今天是坚持刷题更文的第32/100天


⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力


⭐更多算法题欢迎关注专栏《leetcode》


为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等


大家可以先自己找一下获取方式,寻宝游戏现在开始。


如果实在找不到可以评论区留言或私信我领取,不过一定要先关注哦!不然无法发私信!


相关文章
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
5天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
10 0
|
6天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
6天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
6天前
|
存储 算法 测试技术
|
6天前
|
算法 C语言 C++
|
存储 算法 C语言
C语言刷题~Leetcode与牛客网简单题
C语言刷题~Leetcode与牛客网简单题
|
15天前
|
Java 索引
JAVA刷题之数组的总结和思路分享
JAVA刷题之数组的总结和思路分享
|
15天前
|
Java
JAVA刷题之字符串的一些个人思路
JAVA刷题之字符串的一些个人思路