目录

  • 题目:
    • [剑指 Offer 15. 二进制中1的个数](https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/)
    • 题目分析
  • 初始解答:
  • 学习他人:
    • 方法一:
    • 方法二
    • 方法三:
    • Java位运算
  • 总结

刷题日期:18:5215 星期三2021年3月24日

个人刷题记录,代码收集,来源皆为leetcode

经过多方讨论和请教,现在打算往Java方向发力

主要答题语言为Java

题目:

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

难度简单98

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

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

提示:

题目分析

根据提示,输入长度为32位的二进制串,看题目里输入的是int型

最简单的方法肯定是直接转换成char类型一个一个数。

这道题涉及到位运算,可能在程序中也需要一些位运算的符号。

与、或、异或、左右移

初始解答:

直接判断最右边然后位移

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int sum = 0;while(n > 0) {if (n & 1) {sum += 1;n = n >> 1;}}return sum;}
}

if语句后面报错了,不知道为啥,java也支持位运算

参考了方法一,发现while循环的条件和if 的条件都不对,因为n不是布尔值,所以不能直接拿来当判断条件。

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int sum = 0;while(n != 0) {if ((n & 1) == 1) {sum += 1;n = n >>> 1;}}return sum;}
}

修改发现老是超出时间限制,继续修改if中的位移操作。

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int sum = 0;while(n != 0) {if ((n & 1) == 1) {sum += 1;}n = n >>> 1;}return sum;}
}

把唯一操作移出就好了,这样按照题目的输入,位移操作被执行了32次,不管是0还是1都会判断然后位移。

这里需要注意,位移操作>>>和>>的区别,前者按位右移补零操作符,具体区别附在了最后面。

执行结果:通过

显示详情

执行用时:1 ms, 在所有 Java 提交中击败了96.85%的用户

内存消耗:35.6 MB, 在所有 Java 提交中击败了9.17%的用户

根据书里“能给面试官带来惊喜的解法”,把一个整数减去1,再与原数做与运算,会把该整数最右边的1变成0,依此进行尝试:

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int sum = 0;while(n != 0) {n = (n-1) & n;sum ++;}return sum;}
}

没有问题,就是需要记住性质。

执行结果: 通过

显示详情

执行用时:1 ms, 在所有 Java 提交中击败了96.85%的用户

内存消耗:35.6 MB, 在所有 Java 提交中击败了17.13%的用户

学习他人:

方法一:

炉石鲍勃L1 (编辑过)2021-02-28

无符号右移就可以了

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int res = 0;while(n != 0){if((n&1) == 1){res++;}n = n>>>1;}return res;}
}

方法二

java.lang包的Integer类的bitCount()方法以整数值的二进制补码表示形式返回one-bits的数量计数。有时将此功能称为人口计数。

用法:

public static int bitCount(int n)
参数:
n: the value whose bits are to be counted
返回:
This method returns the count of the number of one-bits in the two's complement
binary representation of an int value.

月亮很亮L1 2020-02-25

java居然有这个方法

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

方法三:

Joker 2020-07-03

python一行

 return bin(n).count('1')

Java位运算

下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:

原网址

操作符 描述 例子
如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是 0,则结果为 0,否则为 1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

总结

以上就是本题的内容和学习过程了,这道题比较简单,理解位运算的思路即可,没啥太多好说的。

欢迎讨论,共同进步。

【剑指Offer】个人学习笔记_15_二进制中1的个数相关推荐

  1. 剑指offer——面试题10:二进制中1的个数

    剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...

  2. 剑指offer:面试题15. 二进制中1的个数

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

  3. 《剑指offer》c++版本 15.二进制中1的个数

    如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...

  4. [剑指offer]面试题10:二进制中1的个数

    面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...

  5. 剑指offer系列之十:二进制中1的个数

    题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.比如输入9,9的二进制表示是1001,1的个数是2,所以输出2. 这有一个重要结论:一个数与该数减一的结果进行与运算,会把该 ...

  6. 牛客网(剑指offer) 第十一题 二进制中1的个数

    题目描述:   输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. <?php function NumberOf1($n) { $count = 0;for($i = 0;$i ...

  7. 剑指offer_第11题_二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数. 其中负数用补码表示. 理解 整数怎么转换为二进制 >>> bin(25) '0b11001' >>> bin ...

  8. 剑指Offer的学习笔记(C#篇)-- 数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  9. 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...

最新文章

  1. ORA-15260: permission denied on ASM disk group
  2. 拳王虚拟项目公社:闲鱼操作卖资源如何赚钱?闲鱼怎么卖虚拟资源?卖什么资源赚钱?
  3. python什么是堆什么是栈_顶置篇:CPython的内存概念:栈、堆和引用
  4. mysql开启binlog日志影响性能吗_mysql binlog日志优化及思路
  5. 在EditPlus里直接运行PHP
  6. 【NAACL2021】基于隐式类别建模的非自回归式翻译
  7. 同余方程-NOIP2012TGD2T1
  8. Spark机器学习(一)—Spark相关
  9. 为什么使用工作流引擎,什么是工作流引擎,工作流引擎选型以及如何使用
  10. 光纤通道网络FC vs 以太网光纤通道FCoE
  11. cpu过剩是什么意思_现在为什么人们都说CPU性能过剩,而不说显卡性能过剩?
  12. NLP 文本分词 java类方法,及opennlp 示例
  13. RN vivo访问相册失败 warning : User cancelled image selection
  14. 2017二本各大学计算机分数线,2017全国二本大学排名及分数线查询 (2017二本大学名单一览)...
  15. java中,判断当前时间是否处于某个一个时间段内
  16. 计算机检查磁盘,教你win7系统电脑检测到磁盘错误的解决教程
  17. 禾川Q0 PLC ModbusRTU通讯
  18. MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
  19. springboot-分布式实例开发 (六)
  20. 解决PS 内存不足,RAM不足问题,方案汇总

热门文章

  1. 海奥华预言--第十一章 谁是基督?
  2. 织梦主动提交_织梦实现发布文章主动推送(实时)给百度的方法
  3. 连锁酒店网络互联解决方案
  4. VS Code运行C++程序的配置过程
  5. 硬核干货!全球数字高程数据(DEM)详解,还有地形晕渲、等高线等
  6. 计算机组成原理(4)IO
  7. 反思|开启B站少女心模式,探究APP换肤机制的设计与实现
  8. 一键完成:批量转pdf图片为png、svg格式图片
  9. 【古琴】初学者选择练习琴的六条准则
  10. 【ML】英雄联盟对局胜负预测任务