2013-11-15 2 views
0

문제점을 인터뷰하고 난 후 코드를 테스트 한 결과 잘못된 것으로 나타났습니다. 재귀에는 좋지 않습니다. 그러나 나는 그 문제를 이해할 수 없다.배열의 정수 순열 지정

질문은 : 배열 범위가 0 ~ 9이고 길이가 3 인 경우를 예로 들겠습니다. 주어진 길이의 주어진 배열로부터 정수의 모든 순열을 생성하십시오. 따라서 예 : 순열은 012,013,014, ..., 345,346 ... 이어야합니다. 아래 코드는 어디에 있습니까? (색인 또는 오프셋 부분이라고 생각합니다) 그리고 더 좋은 해결책이 있다면!

public void NumPermutation(int[] list, int offset, int[] temp, int index){ 
    if(index == 4){ 
     printarray(temp); 
    } 

    for(int count = offset; count < list.length; count++){ 
     temp[index++] = list[count]; 
     int te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 
     NumPermutation(list, offset, temp, index); 
     index -= 1; 
    } 
} 

public void test(int len){ 
    int[] list = {0,1,2,3,4,5,6,7,8,9}; 
    int[] temp = new int[4]; 
    int index = 0, offset = 0; 
    NumPermutation(list, offset, temp,index); 
} 

문제는 각 시간을 증가시킬 수 오프셋 및 가도 끝 번호에 도달 할 수 있다는 것이다.

+0

여기서'count' 선언은 어디에 있습니까? – chill

답변

1

당신은 필요 : 재귀 호출에

  • 패스 offset+1합니다.

  • if 문으로 돌아갑니다.

  • 재귀 호출 후 스왑을 되돌립니다.

  • 좀 더 일반적인 해결책으로 4temp.length으로 대체하십시오.

  • 는 바람직 index++, index, index -= 1 index, index + 1 아무것도 교체. 이 코드 결과

는 :

public static void NumPermutation(int[] list, int offset, int[] temp, int index){ 
    if(index == temp.length) { 
     System.out.println(Arrays.toString(temp)); 
     return; 
    } 

    for(int count = offset; count < list.length; count++){ 
     temp[index] = list[count]; 

     // swap 
     int te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 

     NumPermutation(list, offset + 1, temp, index + 1); 

     // reverse swap 
     te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 
    } 
} 

Live demo (이 자바 가정하고, 표준 인쇄 방법 printarray 대체).

+0

놀라운! 감사! – JudyJiang

+0

하지만 왜 마지막에 역 스왑을하는지 이해할 수 없습니까? – JudyJiang

+0

@JudyJiang 왜냐하면, 그렇지 않으면 재귀 할 때 요소의 순서가 엉망이되기 때문입니다. 그리고 for-loop를 실행할 때 다른 모든 요소를 ​​얻고 싶습니다 (그렇지 않으면 값을 반복 함). 그러나 순서가 변경되어 다시 변경되지 않기 때문에 더 이상 보장되지 않습니다. (당신은 그것을 꺼낼 때 무슨 일이 일어날 지 확인할 수 있습니다 - 0,1,2, X와 0,1,9, X를 반복합니다. 0,1,3, X, 0, 1,4, X' 등). – Dukeling