2011-08-18 3 views
0

일부 숫자의 가능한 모든 순열을 찾으려면이 코드를 작성했습니다. 하지만 한 번 두 자리를 두 번 사용하고 싶지 않습니다.
123,132,213은 괜찮 으면서 122,121 등과 같은 번호를 만듭니다.
내가 뭘 잘못하고 있니?모든 순열 코드 찾기 문제 (Java)

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); 
    } 
} 
} 

답변

1

Autoboxing이 당신을 찾고있는 것처럼 보입니다. 'i'를 사용하여 remove를 호출하면, 내 생각에 '나는'다른 객체에 boxed되어 있으므로 HashSet에서 찾을 수 없습니다.

+0

좋아, 나는 오토바이에 대해 많이 모른다. 코드 자체가 최적이 아니라고 생각합니다. HashSet 이외의 다른 다다미 구조를 사용할 수 있습니까? – gethan

+1

@gethan Autoboxing은 Java가 기본 유형 (예 : int)을 등호 클래스 (예 : Integer)로 변환하거나 역순으로 처리하는 곳입니다. 따라서 처음에 HashSet에 int를 추가하면 객체로 변환됩니다. 그 객체를 'AnInt'라고 부를 수 있습니다. 그런 다음 두 번째 int를 제거하면 'AnotherInt'객체에 boxed되고 두 객체는 ​​동일하지 않습니다. 따라서 HashSet은 제거 할 첫 번째 것을 찾지 못합니다. – Wer2

2

tmp.remove(i)이 잘못되었습니다. tmp에서 i 번째 요소를 제거해야합니다 ... 요소 "i"를 제거하고 있습니다. 따라서 tmp.remove(in.toArray()[i])을 수행하십시오. 나는 이것이 이것을 고쳐 줄 것이라고 생각한다. 예를 들어, 0 번째 요소가 17 일 경우 tmp.remove(i)을 수행하면 "17"이 아니라 모든 0이 HashSet에서 제거됩니다.

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); 
     } 

}