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

  • “前戏”
  • 正题——剑指 Offer 15. 二进制中1的个数
  • 题目描述
  • 方法一、逐位相与
    • Python解法
    • Java解法
    • 复杂度分析
  • 方法二 、竟然有这种解法!!!
    • Java解法
    • Python解法
    • C++解法
  • 总结

“前戏”

刷题有时候也没辣么枯燥,比如这样

这个坤坤和杰哥我是经常见了。常常使我破涕而笑~

没有别的意思,晒出来就是好玩~
杰哥很努力啊 ~ 杰哥你也好勇 ~
今天刷题刷到——剑指 Offer 15. 二进制中1的个数

涨新姿势了有木有~
我只能评论1无所有:)

主要是最最最基础的题刷完一道少一道,路越来越难走,做题的激情有所下降,而在这个网站上的人又厉害,说话又好听,所以看到好玩的发发,不喜勿喷~

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

题目描述

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

方法一、逐位相与

参考面试题15. 二进制中 1 的个数(位运算,清晰图解)
思路:根据 与运算 定义,设二进制数字 n ,则有:
若 n & 1 = 0,则 n二进制 最右一位 为 0;
若 n & 1 = 1 ,则 n二进制 最右一位 为 1 。

根据以上特点,考虑以下 循环判断 :
判断 n 最右一位是否为 1 ,根据结果计数。
将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。

算法流程:
初始化数量统计变量 res = 0 。
循环逐位判断: 当 n = 0 时跳出。
res += n & 1 : 若 n & 1 = 1 ,则统计数 res 加一。
n >>= 1 : 将二进制数字 n 无符号右移一位( Java 中无符号右移为 “>>>” ) 。
返回统计数量 res

Python解法

class Solution:def hammingWeight(self, n: int) -> int:res = 0while n:res += n & 1n >>= 1return res

执行用时:36 ms, 在所有 Python3 提交中击败了90.74%的用户
内存消耗:13.4 MB, 在所有 Python3 提交中击败了19.39%的用户

Java解法

public class Solution {public int hammingWeight(int n) {int res = 0;while(n != 0) {res += n & 1;n >>>= 1;}return res;}
}

执行用时:1 ms, 在所有 Java 提交中击败了99.18%的用户
内存消耗:35.6 MB, 在所有 Java 提交中击败了74.50%的用户

复杂度分析

时间复杂度 O(log2n) : 此算法循环内部仅有移位、与、加 等基本运算,占用 O(1) ;逐位判断需循环 log2n次,其中log2n代表数字 n 最高位 1 的所在位数(例如 log24 = 2 , log216 = 4)。
空间复杂度 O(1) : 变量 res使用常数大小额外空间

方法二 、竟然有这种解法!!!

Java解法

参考月亮很亮

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {return Integer.bitCount(n);}
}

执行用时:1 ms, 在所有 Java 提交中击败了99.18%的用户
内存消耗:35.5 MB, 在所有 Java 提交中击败了77.66%的用户

Python解法

参考Joker

class Solution(object):def hammingWeight(self, n):return bin(n).count('1')

执行用时:16 ms, 在所有 Python 提交中击败了81.94%的用户
内存消耗:13.1 MB, 在所有 Python 提交中击败了5.04%的用户

C++解法

参考CWZ

class Solution {public:int hammingWeight(uint32_t n) {return ((bitset<32>)n).count();}
};

执行用时:4 ms, 在所有 C++ 提交中击败了47.20%的用户
内存消耗:6.2 MB, 在所有 C++ 提交中击败了5.03%的用户

总结

主要掌握逐位相与的解法。

【剑指 Offer_15】二进制中1的个数_PythonJava_逐位相与解法相关推荐

  1. 【剑指offer15.二进制中1的个数】——位操作(左移右移等)

    目录 二进制的表示 二进制的位操作 应用: 剑指offer15.统计二进制中1的个数(多种方法,位右移操作.与操作等) 转自:https://www.jianshu.com/p/3a31065a8e5 ...

  2. 剑指offer 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解决方案: public class Solution {public int NumberOf1(int n) {int ...

  3. 剑指offer——二进制中1的个数(c++)

    题目描述 实现一个函数,输入一个整数,输出该数二进制表示中1的个数. 例如,把9表示成二进制是1001,则输出为2 常规解法 首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把 ...

  4. 【LeetCode笔记】剑指 Offer 15-. 二进制中1的个数 (Java、位运算)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 涉及二进制,位运算跑不了- 思路 & 代码 既然是32位,那么通过一次遍历,每次判断一个位是否为1即可 public class S ...

  5. 求二进制中1的个数(编程之美2.1)

    行文脉络 解法一--除法 解法二--移位 解法三--高效移位 解法四--查表 扩展问题--异或后转化为该问题 对于一个字节(8bit)的变量,求其二进制"1"的个数.例如6(二进制 ...

  6. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

  7. 《LeetCode力扣练习》剑指 Offer 15. 二进制中1的个数 Java

    <LeetCode力扣练习>剑指 Offer 15. 二进制中1的个数 Java 一.资源 题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ...

  8. [剑指Offer]12.二进制中1的个数

    题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样 ...

  9. 剑指Offer #11 二进制中1的个数(想不到的骚操作)

    题目来源:牛客网-剑指Offer专题 题目地址:二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目解析 对于这种涉及位运算的题目,我们首先要了解基本的位 ...

最新文章

  1. Python的MySQLdb模块安装
  2. 初识ABP vNext(12):模块的独立运行与托管
  3. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...
  4. Kubelet 对资源紧缺状况的应对
  5. 190403每日一句
  6. webservice框架jersey简单总结
  7. C#可用的RSA公钥加密私钥解密以及私钥加密公钥解密,支持2048
  8. GoLang使用sync.Once
  9. linux文件怎么打包压缩文件,linux文件怎么打包、压缩和解压?详细教程来了!...
  10. unity android录制视频教程,Unity移动端视频录制,Android和IOS都支持
  11. 什么是Subscript?
  12. 2020年最好用的几个PHP开发工具推荐
  13. PDF裁剪页面及调整页面大小的方法
  14. 《复杂网络分析》习题及自我解答
  15. iOS开发 XCode如何清理历史的项目工程记录
  16. android ellipsize的使用
  17. 了解Python 一
  18. 万字长文---手把手教你加固内核安全配置
  19. Matlab Figure 窗口最大化方法
  20. suma++[代碼分析一]: 主入口visualizer.cpp

热门文章

  1. 系统架构升级建议书(2)
  2. web前端与后台数据交互
  3. android 切换语言重启应用程序,Android 切换系统语言后,重启App
  4. 将Maven项目直接用Tomcat运行
  5. css简介,基本语法
  6. DB2自定义数据库方言
  7. webpack——JS模块化说明视频-张晓飞-专题视频课程
  8. Linux设备模型_导航篇
  9. Java的GUI编程---Swing介绍
  10. Python机器学习06——朴素贝叶斯