力扣-338-比特位计数
题目描述:求一个非负数的二进制表示下1的个数。
分析:这道题首先想到的是用位运算来做,LeetCode上还有其他的做法。
如果x的最右一位为1,那么x&(x-1)就是将x的最后一个1去掉。eg:x = (101)2,x&(x-1)=(100)2 。;可以看出x中1的个数比x(x-1)中1的个数多一个;如果最后一位不是1的话怎么办,eg:x=(110)2 ,x&(x-1)=110&101=100。结论还是成立的。那么我们就可以从小到大依次递推求解了。
class Solution { public int[] countBits(int num) { int[] res = new int[num + 1]; //共有num+1个数 res[0] = 0; for(int i = 1; i <= num; i++) { res[i] = res[i&(i-1)] + 1; } return res; } }
还有一种思路:如果x最后一位是1,那么x>>1位后,最低位的1移去后,最高位补0。那么x中1的个数,等于x>>1中1的个数再加1;如果x的最后一位不是1,那么x和x>>1中1的个数相同。
class Solution { public int[] countBits(int num) { int[] res = new int[num + 1]; //共有num+1个数 res[0] = 0; for(int i = 1; i <= num; i++){ if((i&1) == 1){ res[i] = res[i>>1] + 1; }else{ res[i] = res[i>>1]; } } return res; } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!