输出一个集合的所有子集(算法)

原文地址:http://blog.csdn.net/naturebe/article/details/7487394


最近,T公司,B公司,MS都开始大规模的开始实习招聘了。

我们这些不能出去实习的还是老实的呆在实验室码代码(我们组的同学都是好同学,学习认真,工作认真)。

去年参加B公司的一个设计比赛,进了复赛;今天组内组了一个小团队,认真了一次反而落选了,有些遗憾,不过我们都是写代码的,那些不要也罢,葡萄太酸。


这是T公司的一个面试题,写一个集合的所有子集(F牛比我快,我自己只好改了另外一个代码,我觉得比原来的简单了一些)这个题目有好多种方法,欢迎交流。

时间复杂度很显然,最少也是2^n,空间复杂度,是n,代码比较简单(每个元素要么在子集中,要么不在,用 j 的二进制形式的每一位代表数组a中对应的位置的元素是否在子集中,例如,当i = 5时, j = i = 5,那么j = 0101; 我们对应的输出 a[0], a[2], 这个过程在while循环中完成)


  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.         int a[4] = {1, 2, 3, 4};  
  6.         int i, j, k;  
  7.         int t = 1 << 4;  
  8.         for (i = 0; i < t; i++)  
  9.         {  
  10.                 j = i;  
  11.                 k = 0;  
  12.                 printf("{");  
  13.                 while (j)  
  14.                 {  
  15.                         if (j & 1)  
  16.                         {  
  17.                                 printf("%d", a[k]);  
  18.                         }  
  19.                         j >>= 1;  
  20.                         ++k;  
  21.                 }  
  22.                 printf("}\n");  
  23.         }  
  24.         return 0;  
  25. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值