赞
踩
方法1:通过二进制位,因为n个整数数组的子集有2的n次方个,例如整数数组为{1,2,3},子集有2的3次方,8个;
期望的输出形式
其中需要了解关注的是
n&1判断最低位是否有数。如果一个子集为{2},利用二进制位2&1让其最低位空出来,依次类推。
n>>1结果是n/2
将n&1与n>>1结合就可以得到
若n=3(011); n&1=1 其最低位可以得到,n>>1 = 1;其次低位可以低到,
可以通过下面代码解读
- #include <stdio.h>
-
- int main(int argc, char const *argv[])
- {
- int n=3;
- int str1[3]={1,2,3}; // 定义一个数组
- int str2[3]={0};
- for (int i = 2; i >= 0; i--)
- {
- if(n&1) // i=2 n=3 n&1=1 ; i=1 n=1 n&1=1 ; i=0 n=0 n&1=0
- {
- str2[i]=str1[i];// str2[2]=str1[2] ;str2[1]=str1[1] ;
- }
- n >>= 1; // n=1 n=0
- }
- for (int i = 0; i < 3; i++)
- {
- printf("%d ",str2[i]); // str2[2]=str1[2] ;str2[1]=str1[1] ; str[0]未被赋值
- }
-
- return 0;
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
此时得到了
以上述思想求整数数组的子集
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
-
- int main(int argc, char const *argv[])
- {
- int nums[3] = {1,2,3};
- int numsSize = 3;
- int num = pow(2,numsSize);
- int **returnColumnSizes;
- returnColumnSizes = (int**)malloc(sizeof(int*)*num);
- for(int i = 0; i < num; i++)
- {
- returnColumnSizes[i] = (int*)malloc(sizeof(int)*numsSize);
- }
- for(int i = 0; i < num; i++)
- {
- for(int j = 0;j < numsSize; j++)
- {
- returnColumnSizes[i][j] = 0;
-
- }
-
- }
- for(int i = 0; i < num; i++)
- {
- for(int j = 0; j < numsSize; j++)
- {
- returnColumnSizes[i][j]=0;
- printf("%d ",returnColumnSizes[i][j]);
- }
- printf("\n");
- }
- printf("---------\n");
- for(int i = 0; i < num; i++)
- {
-
- int n=i;
- int k=0;
- while (n)
- {
- if(n&1)
- {
- returnColumnSizes[i][k]=nums[k];
- }
- n >>= 1;
-
- k++;
- }
-
-
- }
- printf("---------\n");
-
- for(int i = 0; i < num; i++)
- {
-
- for(int j = 0; j < numsSize; j++)
- {
- if(returnColumnSizes[i][j]==0)
- {
- continue;
- }
- printf("%d ",returnColumnSizes[i][j]);
-
- }
-
- printf("\n");
- }
-
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
本题本来打算写来回答力扣题78题求子集的,但是,才疏学浅,还是我不配。
最终结果将所有0都去掉了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。