查找所有可用组合

时间:2015-11-15 12:23:56

标签: java algorithm recursion combinations

如何查找某些数字的所有可用组合。例如,我有0,1,2。在输出中我应该收到这样的东西:

0 01 02 012 021 1 10 12 102 120 2 20 21 201 210 问题出在算法上。我认为这里应该是递归,但是如何写呢?

1 个答案:

答案 0 :(得分:0)

我有一个用字符串完成相同的操作。但是,我只是交换随机数字,直到我得到所有组合(这是字符串长度的阶乘)。然后我打印出非经常性的。

我是这样做的,只需将您输入的字符串更改为allpos()方法,它将适用于任何数字。

import java.util.Random;
import java.util.Scanner;

public class shift {

public static void main(String[] args) {

    //Change "012" to anything, even a String.
  allpos("012");
}
public static int unbin(String s){

    int ans=0;
    for(int x=0;x<s.length();x++){
        char c=s.charAt(x);
        if(c=='1'){
        ans+=Math.pow(2, s.length()-1-x);
        }

    }
    return ans;


}
public static String bin(int n){
    int[] ans=new int[32];
    int a=n;
    for(int x=31;x>=0;x--){
        if(Math.pow(2, x)<=a){
            a-=Math.pow(2, x);
            ans[x]=1;
        }
    }
    String s="";boolean zero=false;
    for(int x=ans.length-1;x>=0;x--){
        if(ans[x]==1){
            s+="1";
            zero=true;
            continue;
        }else if(zero){
            s+="0";
        }
    }
    return s;
}
public static boolean ispresent(String[] words,String s){
    for(int x=0;x<words.length;x++){
        if(words[x]==null){return false;}
        if(words[x].equals(s)){return true;}

    }
    return false;



}   
public static void allpos(String s){

    int fac=1;
    for(int x=1;x<=s.length();x++){
        fac*=x;
    }
    int len=s.length();
    String[] values=new String[fac];
    values[0]=s;
    System.out.println(s+" (1)");
    int id1=0,id2=0;
    Random r=new Random();
    for(int x=1;x<fac;){

        s=inchange(s,r.nextInt(len),r.nextInt(len));
        if(ispresent(values,s)==false){
            values[x]=s;
            x++;
            System.out.println(s+" ("+x+")");
        }

    }


}
public static String inchange(String s,int id1,int id2){
    char[] chars=new char[s.length()];
    for(int x=0;x<s.length();x++){
        chars[x]=s.charAt(x);

    }
    char temp=chars[id1];
    chars[id1]=chars[id2];
    chars[id2]=temp;
    String ans="";
    for(int x=0;x<s.length();x++){
        ans+=chars[x];

    }
    return ans;
}

}

我知道它效率低下但是它可以为较小的数字完成工作。我希望这会有所帮助。