剑指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

浙公网安备 33010602011771号