原文地址: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循环中完成)
- #include <stdio.h>
- int main()
- {
- int a[4] = {1, 2, 3, 4};
- int i, j, k;
- int t = 1 << 4;
- for (i = 0; i < t; i++)
- {
- j = i;
- k = 0;
- printf("{");
- while (j)
- {
- if (j & 1)
- {
- printf("%d", a[k]);
- }
- j >>= 1;
- ++k;
- }
- printf("}\n");
- }
- return 0;
- }