【剑指Offer】个人学习笔记_15_二进制中1的个数
目录
- 题目:
- [剑指 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的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
输入: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的个数相关推荐
- 剑指offer——面试题10:二进制中1的个数
剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...
- 剑指offer:面试题15. 二进制中1的个数
题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...
- 《剑指offer》c++版本 15.二进制中1的个数
如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...
- [剑指offer]面试题10:二进制中1的个数
面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...
- 剑指offer系列之十:二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.比如输入9,9的二进制表示是1001,1的个数是2,所以输出2. 这有一个重要结论:一个数与该数减一的结果进行与运算,会把该 ...
- 牛客网(剑指offer) 第十一题 二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. <?php function NumberOf1($n) { $count = 0;for($i = 0;$i ...
- 剑指offer_第11题_二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数. 其中负数用补码表示. 理解 整数怎么转换为二进制 >>> bin(25) '0b11001' >>> bin ...
- 剑指Offer的学习笔记(C#篇)-- 数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...
最新文章
- ORA-15260: permission denied on ASM disk group
- 拳王虚拟项目公社:闲鱼操作卖资源如何赚钱?闲鱼怎么卖虚拟资源?卖什么资源赚钱?
- python什么是堆什么是栈_顶置篇:CPython的内存概念:栈、堆和引用
- mysql开启binlog日志影响性能吗_mysql binlog日志优化及思路
- 在EditPlus里直接运行PHP
- 【NAACL2021】基于隐式类别建模的非自回归式翻译
- 同余方程-NOIP2012TGD2T1
- Spark机器学习(一)—Spark相关
- 为什么使用工作流引擎,什么是工作流引擎,工作流引擎选型以及如何使用
- 光纤通道网络FC vs 以太网光纤通道FCoE
- cpu过剩是什么意思_现在为什么人们都说CPU性能过剩,而不说显卡性能过剩?
- NLP 文本分词 java类方法,及opennlp 示例
- RN vivo访问相册失败 warning : User cancelled image selection
- 2017二本各大学计算机分数线,2017全国二本大学排名及分数线查询 (2017二本大学名单一览)...
- java中,判断当前时间是否处于某个一个时间段内
- 计算机检查磁盘,教你win7系统电脑检测到磁盘错误的解决教程
- 禾川Q0 PLC ModbusRTU通讯
- MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
- springboot-分布式实例开发 (六)
- 解决PS 内存不足,RAM不足问题,方案汇总