今天开始,刷leetcode!一方面重新熟练编程,一方面为面试做准备!
同时,记录每道题,并且要解释清楚,为的是面试能解释给面试官听!
题意:求出【0,1,2,3……num】他们每个数字的二进制的1的个数
思路:
用举例法
8的二进制是1000, 15的二进制是1111
即8~15的二进制是1000~1111
第一位永远是1
则其countbit数量取决于000~111这个过程
而000~111也就是0~7,在之前已经计算过了,即可以直接利用
即8~15的countbit为p[i]=p[i-8],edg为8,即差值
同理,16~31就是10000到11111,而0000~1111的countbit数量前面已经知道了
所以16~31的countbit为p[i]=p[i-16],差值edg为16
所以照着这个思路很快就能写出答案,重要的是如何求edg
C\C++:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* countBits(int num, int* returnSize) {
int i=0;
int edg=1;
int *ans,*p;
p=malloc((num+1)*sizeof(int)); //分配内存,num+1个而不是num个
*returnSize=num+1; //返回总个数
ans=p; //ans指向数组首地址,p用来计算
*p=0; //第一个是0
p++;
i=1;
while(i<=num)
{
*p=1+*(p-edg); //由之前所计算的得到答案
i++;
p++;
if(i==edg*2) //当i等于差值*2时,改变差值
edg=edg*2;
}
return ans;
}
python:
class Solution(object):
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
ans=[0]
edg=1;
i=1;
while i<=num:
ans.append(1+ans[i-edg])
i+=1
if i==edg*2:
edg=edg*2
return ans
1.C++中,对len长的int数组的new的形式为p=new int[len]
2.C中,为malloc(num*sizeof(int))
3.注意观察题意,returnSize顾名思义就是长度,函数返回值为一个指针,那么肯定就是所求数组。
4.python中,列表就像数组,往数组尾端加元素只需要用append函数即可!