前言
哈喽,大家好,我是一条。
糊涂算法,难得糊涂
面试陌陌时遇到的一道题
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 ,其余不变。
- 通过与运算不断消去右边的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)
????寻宝
⭐今天是坚持刷题更文的第32/100天
⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力
⭐更多算法题欢迎关注专栏《leetcode》
为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等
大家可以先自己找一下获取方式,寻宝游戏现在开始。
如果实在找不到可以评论区留言或私信我领取,不过一定要先关注哦!不然无法发私信!