连续自然数二进制中 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

 

posted @ 2020-07-30 16:54  repinkply  阅读(228)  评论(0)    收藏  举报