查找所有排列代码问题(Java)

时间:2011-08-18 14:33:05

标签: java permutation

我写了这段代码来找到一些数字的所有可能的排列。但我不想两次使用一位数: 123,132,213都可以,但是会产生122,121等数字 我做错了什么?

import java.util.HashSet;

public class main {

public static void main(String[] args) {        

    HashSet<Integer> l = new HashSet<Integer>();        
    for(int i=0;i<=3;i++){
        l.add(i);
    }       
    perm(l,3,new StringBuffer());

}

 static void perm(HashSet<Integer> in, int depth,StringBuffer out){             
    if(depth==0){
        System.out.println(out);
        return;
    }       

    int len = in.size();
    HashSet<Integer> tmp = in;

    for(int i=0;i<len;i++){
        out.append(in.toArray()[i]);
        tmp.remove(i);

        perm(tmp,depth-1,out);

        out.deleteCharAt(out.length()-1);
        tmp.add(i);
    }
}
}

3 个答案:

答案 0 :(得分:2)

tmp.remove(i)错了。你需要从tmp中删除第i个元素......你要删除元素“i”。那么,做tmp.remove(in.toArray()[i])。我认为这样可以解决这个问题。例如,如果第0个元素是17,那么执行tmp.remove(i)将从HashSet中删除所有零,而不是“17”。

答案 1 :(得分:1)

看起来Autoboxing正在吸引你。当你用'i'调用remove时,我的猜测是'i'被装箱到另一个对象,因此在你的HashSet中找不到。

答案 2 :(得分:0)

这是使用HashSet的更简单的实现。我使用字符串,但概念保持不变。

public void printPermutations(String str){
    HashSet<String> hs = new HashSet<>();
    printPermutations("", str, hs);
}

public void printPermutations(String prefix, String end, HashSet<String> hs){
    if(end.equals(""))
        System.out.println(prefix);
    for(int i = 0; i < end.length(); ++i)
        if(hs.add(prefix + end.charAt(i))){
            printPermutations(prefix + end.charAt(i), 
                    end.substring(0,i) + end.substring(i + 1, end.length()), hs);
        }

}