《苦练算法》-剑指Offer- 十一、 二进制中1的个数 -python/java编写
2018-02-03 11:12
281 查看
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目分析
输出 1的个数,这个一看就很明确是针对 位操作的题目,一个整数是四字节的所以就是32位,所以我们可以每一位每一位的来判断,最后把判断的结果相加在一起,每次都向右移一位,故从低位到高位不断移动,之后每次都用向右移位一次的数字与1相与,得到的就是是否此时的最低位为1,如果为1,得到的为1,如果为0,得到的为0
举个例子
5 ==》 101
1. 向右移0位 101&1 = 1
2. 向右移1位 10&1 = 0
3. 向右移2位 1&1 = 1
。。。。。。
代码如下:
也可以巧妙运用python 的sum和list的特点
代码如下:
有更加简便的方法 就是用while 来判断当前的n是否为0,每次都把n重新赋值一下
n = n >>1 再判断此时的n的最后一位是否为1 之后对count计数处理,其实和上面的思想一样就是用了一个n移位结束的条件,做了个while循环的条件结尾
但是这么写python语言的执行时间太长,所以这里选择java
代码如下:
你可能看了代码发现和自己想的不太一样
因为这里相当于用了一个非常巧妙地思想,但是万变不离其中
n = n&(n - 1);的意思就是将n的二进制数的最右面一个1化解掉
举个例子,你马上就会懂
n = 5 ==》 101
101 - 1 = 100&101 = 100
n = 12 ==》1100
1100 -1 = 1011 &1100 = 1000 所以依旧还是将最右面一个1化解掉
继续下去
1000-1 = 0111&1000 = 0000
所以n = 0 结束循环
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目分析
输出 1的个数,这个一看就很明确是针对 位操作的题目,一个整数是四字节的所以就是32位,所以我们可以每一位每一位的来判断,最后把判断的结果相加在一起,每次都向右移一位,故从低位到高位不断移动,之后每次都用向右移位一次的数字与1相与,得到的就是是否此时的最低位为1,如果为1,得到的为1,如果为0,得到的为0
举个例子
5 ==》 101
1. 向右移0位 101&1 = 1
2. 向右移1位 10&1 = 0
3. 向右移2位 1&1 = 1
。。。。。。
代码如下:
# -*- coding:utf-8 -*- class Solution: def NumberOf1(self, n): # write code here sum_c = 0 for i in range(32): count = n>>i&1 sum_c += count return sum_c
也可以巧妙运用python 的sum和list的特点
代码如下:
# -*- coding:utf-8 -*- class Solution: def NumberOf1(self, n): # write code here return sum([(n>>i)&1 for i in range(32)])
有更加简便的方法 就是用while 来判断当前的n是否为0,每次都把n重新赋值一下
n = n >>1 再判断此时的n的最后一位是否为1 之后对count计数处理,其实和上面的思想一样就是用了一个n移位结束的条件,做了个while循环的条件结尾
但是这么写python语言的执行时间太长,所以这里选择java
代码如下:
public class Solution { public int NumberOf1(int n) { int count = 0; while( n!= 0) { count ++ ; n = n&(n - 1); } return count; } }
你可能看了代码发现和自己想的不太一样
因为这里相当于用了一个非常巧妙地思想,但是万变不离其中
n = n&(n - 1);的意思就是将n的二进制数的最右面一个1化解掉
举个例子,你马上就会懂
n = 5 ==》 101
101 - 1 = 100&101 = 100
n = 12 ==》1100
1100 -1 = 1011 &1100 = 1000 所以依旧还是将最右面一个1化解掉
继续下去
1000-1 = 0111&1000 = 0000
所以n = 0 结束循环
相关文章推荐
- 《苦练算法》-剑指Offer- 十四、 链表中倒数第k个结点 -python/java编写
- 《苦练算法》-剑指Offer- 二十九、最小的k个数-python编写
- 《苦练算法》-剑指Offer- 七、 斐波那契数列 -python编写
- 《苦练算法》-剑指Offer- 二十七、字符串的排序-python编写
- 《苦练算法》-剑指Offer- 二十二、从上往下打印二叉树 -python编写
- 《苦练算法》-剑指Offer- 二、 替换空格 -python编写
- 《苦练算法》-剑指Offer- 九、 变态跳台阶 -python编写
- 《苦练算法》-剑指Offer- 十九、顺时针打印矩阵 -python编写
- 《苦练算法》-剑指Offer- 十三、 调整数组顺序使奇数位于偶数前面 -python编写
- 《苦练算法》-剑指Offer- 一、 二维数组中的查找 -python编写
- 《苦练算法》-剑指Offer- 十七、树的子结构 -python编写
- 《苦练算法》-剑指Offer- 六、 旋转数组的最小数字 -python编写
- 《苦练算法》-剑指Offer- 八、 跳台阶 -python编写
- 《苦练算法》-剑指Offer- 三十一、从1到n整数中1出现的次数-python编写
- 《苦练算法》-剑指Offer- 十、 矩形覆盖 -python编写
- 《苦练算法》-剑指Offer- 四、 重建二叉树 -python编写
- 《苦练算法》-剑指Offer- 二十一、栈的压入、弹出序列 -python编写
- 《苦练算法》-剑指Offer- 三十、最小的k个数-python编写
- 《苦练算法》-剑指Offer- 三十四、第一个只出现一次的字符-python编写
- 《苦练算法》-剑指Offer- 二十八、数组中出现次数超过一半的数字-python编写