算法-算法:求一个集合中的所有子集(非空),前辈们看下有什么地方需要改进吗?

发布于 2017-04-18 01:29:31 字数 812 浏览 1100 评论 2

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2017-10-24 21:45:08

举个例子
假如length=15
那么num依次是
0000
0001
0010
0011
....
1100
1101
1110
1111
你可以观察下每次变化的位数是哪些?

变化的位数是二进制数里最右边零以及它的右边
而它的右边又全部是1
所以你根据这个你可以再想想怎么改进

偏爱自由 2017-06-04 13:25:24

关于System.out.print的调用次数问题,在这里你每打一个字符就调用一次,这非常浪费时间,应该使用StringBuilder把结果存放起来,最后调用一次print把内容打印出来就可以了。
你没有利用前面计算好的组合来计算下一次组合,每一次都是重新计算。当j=1的时候,是可以利用j=0的结果,当j=2的时候,可以利用j=1的结果。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文