连续自然数二进制中 1 的个数(leetcode 338)
一:解题思路
方法一:之前做过一道求一个正整数二进制中1的个数的题目,利用这个题目为基础,然后遍历从1-n 这n+1 个数字。Time:O(n*k),Space:O(1)
方法二:利用动态规划的思想来做,递推公式为:d[i]=d[i&(i-1)]+1。Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
方法一C:
int theNumberOfOne(int n) { int count = 0; while (n != 0) { count++; n &= (n-1); } return count; } int* countBits(int num, int* returnSize) { int* d = (int*)malloc((num+1)*sizeof(int)); for (int i = 0; i <= num; i++) { d[i] = theNumberOfOne(i); } *returnSize = num+1; return d; }
方法二C:
int* countBits(int num, int* returnSize) { int* d = (int*)malloc((num+1)*sizeof(int)); d[0] = 0; for (int i = 1; i <= num; i++) { d[i] = d[i & (i - 1)] + 1; } *returnSize = num + 1; return d; }
方法一C++:
class Solution { private: int theNumberOfOne(int n) { int count = 0; while (n != 0) { count++; n &= (n-1); } return count; } public: vector<int> countBits(int num) { vector<int> d(num+1,0); for (int i = 0; i <= num; i++) { d[i] = theNumberOfOne(i); } return d; } };
方法一Java:
class Solution { private int theNumberOfOne(int num) { int count=0; if(num!=0) { count++; num&=(num-1); } return count; } public int[] countBits(int num) { int[] d=new int[num+1]; for(int i=0;i<=num;i++) { d[i]=theNumberOfOne(i); } return d; } }
方法二C++:
class Solution { public: vector<int> countBits(int num) { vector<int> d(num+1,0); for (int i = 1; i <= num; i++) { d[i] = d[i& (i - 1)] + 1; } return d; } };
方法二Java:
class Solution { public int[] countBits(int num) { int[] d=new int[num+1]; for(int i=1;i<=num;i++) { d[i]=d[i & (i-1)]+1; } return d; } }
Python方法一:
class Solution: def theNumberOfOne(self,n:int)->int: count=0 while n: count+=1 n&=(n-1) return count def countBits(self, num: int) -> List[int]: d=[] for i in range(0,num+1): d.append(self.theNumberOfOne(i)) return d
Python方法二:
class Solution: def countBits(self, num: int) -> List[int]: d=[0]*(num+1) for i in range(1,num+1): d[i]=d[i&(i-1)]+1 return d

浙公网安备 33010602011771号