牛客网刷题之二进制中1的个数
来源:互联网 发布:表白软件手机版 编辑:程序博客网 时间:2024/04/29 22:42
题目描述:
解题思路:
一开始想到的是除二取余法,可是题目给的int类型的,并不能通过测试;然后,显然就是位与运算了,每次先与0X01进行与操作,若非0,则计数器加1,然后向右移1位,循环这个过程。
public int NumberOf1(int n) { int sum = 0; while(n != 0){ sum += n & 0x01; n >>= 1; } return sum; }
然而却被判运行超时了,原来这种方法循环次数始终为8,测试里弄一个比较大的数就卡住时间了;那又只能另辟出路了。
如果一个数不为0,那么二进制表示的话就至少有一个是1,如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。例如11100(28),减1得到11011,将得到的数再和原来的整数做&运算,将得到11000,以此类推,有多少个1就可以进行多少次这种运算。
题解:
public int NumberOf1(int n) { int sum = 0; while(n != 0){ n &= (n-1); sum ++; } return sum; }
ac结果:
0 0
- 牛客网刷题之二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- HDOJ-【2601 An easy problem】
- Uva1152 查找优化的四种方法 中途相遇法
- 码云(gitosc)(含git安装教程)之免费私有的版本控制仓库(小白篇)
- 基本的gradient descent梯度下降法
- java常量池概念
- 牛客网刷题之二进制中1的个数
- Flume和Kafka整合
- HDU 3555 Bomb 【数位dp】
- 移动应用中html的head配置让界面适应屏幕
- .net 将session存入数据库
- maven生命周期
- 数据结构实验之栈八:栈的基本操作 简单方法
- 在Android和iOS中读取静态图像
- 跳房子