如何查找某些数字的所有可用组合。例如,我有0,1,2。在输出中我应该收到这样的东西:
0 01 02 012 021 1 10 12 102 120 2 20 21 201 210 问题出在算法上。我认为这里应该是递归,但是如何写呢?
答案 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;
}
}
我知道它效率低下但是它可以为较小的数字完成工作。我希望这会有所帮助。