算法-算法:求一个集合中的所有子集(非空),前辈们看下有什么地方需要改进吗?
public class Test {
public static void getSubset(char set[])
{
int length=set.length;//集合元素个数
int num=(2<<set.length-1)-1;//集合非空子集个数
for(int i=1;i<=num;i++)
{
System.out.print("[");
int now=i; //当前正在判断第i种可能,暂存起来
for(int j=0;j<=length-1;j++)
{
if((now&1)==1) //二进制位为1表示该元素存在
{
System.out.print(set[j]);
}
now=now>>1; //继续判断下一位
}
System.out.print("]");
}
}
public static void main(String[] args) {
char set[]={'a','b','c','d'};
getSubset(set);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
举个例子
假如length=15
那么num依次是
0000
0001
0010
0011
....
1100
1101
1110
1111
你可以观察下每次变化的位数是哪些?
变化的位数是二进制数里最右边零以及它的右边
而它的右边又全部是1
所以你根据这个你可以再想想怎么改进
关于System.out.print的调用次数问题,在这里你每打一个字符就调用一次,这非常浪费时间,应该使用StringBuilder把结果存放起来,最后调用一次print把内容打印出来就可以了。
你没有利用前面计算好的组合来计算下一次组合,每一次都是重新计算。当j=1的时候,是可以利用j=0的结果,当j=2的时候,可以利用j=1的结果。