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

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

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


糊涂算法,难得糊涂


面试陌陌时遇到的一道题


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 ,其余不变。

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

  • 通过与运算不断消去右边的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)

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

????寻宝

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


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


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


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


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


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


上一篇:【leetcode刷题】31.旋转数组的最小数字——Java版


下一篇:install hexo on ubuntu