【问题标题】:Find all available combinations查找所有可用的组合
【发布时间】:2015-11-15 12:23:56
【问题描述】:

我怎样才能找到一些数字的所有可用组合。例如,我有 0、1、2。在输出中我应该收到如下内容:

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

【问题讨论】:

  • 在您发布一些尝试之前,您会被否决……即使是错误的尝试也可能会导致这里有人帮助您。所以请帮自己一个忙,先写一些代码,然后再让别人为你写代码!
  • 它被称为电源组。谷歌一下,你应该可以开始了。
  • 我投票决定将此问题作为离题结束,因为 OP 没有表现出他的努力 - 看起来像是一项家庭作业。

标签: java algorithm recursion combinations


【解决方案1】:

我对字符串也做过同样的事情。但是,我只是交换随机数字,直到获得所有组合(这是字符串长度的阶乘)。然后我打印出非经常性的。

这就是我的做法,只需将您输入的字符串更改为 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;
}

}

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

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多