给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2 输出:[0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10
示例 2:
输入:n = 5 输出:[0,1,1,2,1,2] 解释: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101
思路:先将两个基本的数1和0进行判断,再从这基础上进行奇数偶数判断。
- #include <stdio.h>
- #include <stdlib.h>
-
-
- int* countBits(int n, int* returnSize)
- {
- int *ans = malloc(sizeof(int)*(n+1));//开辟一个空间,长度为n+1
- if(n == 0)
- {
- *returnSize = 1;//当n=0时,返回长度为1,数组第一个元素为0
- ans[0] = 0;
- return ans;
- }
- if(n == 1)
- {
- *returnSize = 2;//当n=1时,返回长度为2,数组第一个元素为0,第二个元素为1
- ans[0] = 0;
- ans[1] = 1;
- return ans;
- }
- ans[0] = 0;
- ans[1] = 1;//从两种基础的情况上开始判断
- for(int i = 2;i <= n ;i++)//循环判断奇数偶数
- {
- if(i % 2 == 0)
- {
- ans[i] = ans[i/2];
- /*当i为偶数时,ans[i]中1的个数=和ans[i/2]中个数相等,因为两个二进制数i/2相加,所产生1的进位与i/2中1的个数相等*/
- }else{
- ans[i] = ans[i - 1] + 1;//当i为奇数时,所包含的1的个数为前一个偶数中1的个数+1
- }
- }
- *returnSize = n+1;
- return ans;
- }
-
- int main()
- {
- int n = 10;
- int returnSize = 0;
- int* nums = countBits(n, &returnSize);
- printf("returnSize = %d\n",returnSize);
- for(int i = 0;i < returnSize;i++)
- {
- printf("nums[%d] = %d\n",i,nums[i]);
- }
- free(nums);
- nums = NULL;
- return 0;
- }
