您的位置:首页 > 其它

求一个数组的全部子集的两种解法

2016-08-08 19:22 246 查看
一个常见的情景是罗列出[1,2,5,8]的全部子集,结果如下[],[1],[2],[5],[8],[1,2].................

结果有很多,这中解法的题型非常的多,

那么第一种解法就是利用递归,压栈处栈 

基本思想就是,1,2,5,83为一组 

 12 15 18 25 28为一组 

125 128 258为一组 

 1258为一组 

 也就是说固定前面的数字 依次切换

代码如下:

public class CCCC {

private static List<Integer> stack1=new ArrayList<Integer>();
private static int[] savenumber=null;
private static List<String> jieguo=new ArrayList<String>();

public static void di(int index, int ce ,int start)
{

for(int i=start;i<savenumber.length;i++)
{
stack1.add(i);
if(ce==index)
{
yan();
}else{

di(index,ce+1, i+1);

}
stack1.remove(stack1.size()-1);
}
}
public static boolean yan() {

String he="";
for(int i=stack1.size()-1;i>=0;i--)
{
he+=savenumber[stack1.get(i)]+",";
}

jieguo.add(he);
return true;

}

public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextInt()){
Integer num= scanner.nextInt();
savenumber=new int[num];

for(int i=0;i<num;i++)
{
savenumber[i]=scanner.nextInt();
}

for(int ceng=1;ceng<=num;ceng++)
{
di(ceng,1,0);
}
System.out.println(jieguo.toString());

}
}

第二种算法,利用二进制的思想 如 0110 1001 0001 
加入数组为[1,2,5,8]     0110 就代表[ 2,5]  1001 代表[ 1,8]          0表示该数组位置不选,1表示选中

代码如下

zpublic class SSSS {
static int n;
static List<String> list=new ArrayList<String>();
public static void get(int x,int[] mm){
String sum="";
String m=getBinaryValue(x);
char[] data=m.toCharArray();
for (int i = 0; i < data.length; i++) {
if(data[i]=='1'){
sum+=mm[i];
}

}
if(!sum.equals(""))
list.add(sum);
}

public static String getBinaryValue(int x)
{

StringBuffer sb = new StringBuffer(Integer.toBinaryString(x));
int length = sb.length();

for(int j=0;j<n-length;j++){
sb.insert(0, "0");
}

return sb.toString();

}

public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int[] mm;
n=in.nextInt() ;//注意while处理多个case

mm=new int
;
for(int i=0;i<n;i++){
mm[i]=in.nextInt() ;

}
for (int i = 0; i < Math.pow(2, n)-1; i++) {
get(i, mm);
}
System.out.println(list.toString());
}
}
当我们得到所以集合时,问题将迎刃而解,

不仅仅数组可以这么做,字符串也可以,当我们学习一种算法,要掌握它的思想,做到举一反三
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息