您的位置:首页 > Web前端

《苦练算法》-剑指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

。。。。。。

代码如下:

# -*- 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 结束循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐