剑指offer15 二进制中1的个数

14题剪绳子有问题,牛客网上也没有,于是就跳过了。

这题有意思,看到进制相关就应该想到用移位,与或非等二进制相关运算操作。

开始还在想,怎么把负数转变成补码呢,后来一想,负数本来不就是补码么,不需要转换,直接做就好。

这篇博客对补码的解释比较好:https://www.cnblogs.com/guanjianzhuo/p/6017291.html https://www.cnblogs.com/zengguowang/p/6074845.html

其实补码没什么难的,就是为了充分利用数位资源,多表示一个数。符号数中,反码就只能表示2^n-1个数,补码可以表示2^n个数。

方法一:

&1,1不变,数右移。但是负数右移会补1而不是0.

放弃。

方法二:

数不移动,flag=1移动。

public class Solution {
    public int NumberOf1(int n) {
        int flag = 1;
        int count = 0;
        while(flag!=0){
            if((flag&n)!=0) count++;
            flag = flag<<1;
        }
        return count;
    }
}

运行时间:12ms

占用内存:9316k

方法三:

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!=0){
            n = n&(n-1);
            count++;
        }
        return count;
    }
}

运行时间:15ms

占用内存:9304k

 

python的int不止32位,所以需要做一些改动:

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        flag = 1
        count = 0
        for i in range(32):
            if n&flag != 0:
                count +=1
            flag = flag << 1
        return count

运行时间:31ms

占用内存:6076k

 

posted @ 2019-02-21 10:59  大胖子球花  阅读(129)  评论(0)    收藏  举报