전체 정렬 인쇄

9080 단어
문자열의 전체 배열을 출력하는 데는 여러 가지 방법이 있는데, 가장 쉽게 볼 수 있는 것은 귀속적인 방법이다.
void range(char a[], int k){
if(k==a.length-1){
System.out.println(Arrays.toString(a));
}
else {
for(int i=k;i
swap(a[i],a[k]);
range(a,k+1);
swap(a[k],a[i]);
}
}
창고를 빌려 위의 것을 비귀속으로 바꿀 수도 있다.
 
물론 다른 방법도 있다. 예를 들면
1. 사전 순서 방법.
Num[] 보조 배열을 사용하여 작성합니다.
void printRange(char a[]){
for(int i=0;i
num[i]=i;
}
while(hasNext(num)){
print(a,num);
moveNext(num);
}
------
예를 들어 abc가 대응하는 보조수조의 초기 상태는 012이고num이 210이 되면hasNext(num)는false이다.
어떻게 012에서 다음 것을 생성합니까?
예를 들어 124653, 우리는 그것의 다음 숫자열을 찾아야 한다. 사용하는 방법은
1. 오른쪽에서 왼쪽으로 스캔하여 위치를 찾습니다.num[pos]
그리고num[pos]와num[k]를 교환합니다.
2 다음에pos+1~n-1 위치의 문자를 교환합니다. 즉,reverse the substringfrompos+1~n-1 위치의 문자를 교환합니다.
 
또 다른 방법은 진법 증가법이라고 한다.
http://llfclz.itpub.net/post/1160/278490
n개의 숫자가 있다고 생각하면 먼저 첫 번째 숫자를 뽑아라.두 번째 숫자를 취하면 두 번째 숫자는 첫 번째 숫자의 왼쪽이나 오른쪽에 놓을 수 있다. 바로 0, 1 두 가지 선택이 있다.세 번째 수를 취하여 앞에서 선택한 두 숫자 중 가장 왼쪽, 중간, 가장 오른쪽에 놓을 수 있다. 바로 0, 1, 2, 세 가지 선택이 있다.응, 자연스러워.갑자기 너는 2진위, 8진위의 수계 전환 관계가 생각났다.이런 수를 설계할 수 있는데...xyz, 그 중에서 개수 z는 2진위, 즉 두 번째 수의 두 위치를 놓는다.10자리수 y는 3진위이고 세 번째 숫자를 넣은 세 자리를 대표한다. 그 다음에 백자리수는 4진위이고 천자리수는 5진위이다."맞아요. 이렇게 디자인하면 0이 맨 왼쪽에 놓는다는 뜻이라면'2021'이 수는 다섯 개의 원소(abcde)를 배열하고 하나를 취하고 두 번째 b를 a의 오른쪽에 놓으면 ab가 되고, c를 맨 오른쪽에 놓으면 abc가 되고, d를 맨 왼쪽에 놓으면dabc가 되고, 마지막으로 e를 가운데에 놓으면 daebc가 됩니다. 2021까지""이 특별한 디자인의 수는 2*5+0*4+2*3+1*2 같은 계산으로 자연수의 수열에 비칠 수 있다.
네 개의 수를 구하는 4!=24개의 배열, 18개의 배열은 이렇게 구할 수 있다. 18을 2로 나누면 나머지는 0이기 때문에 두 번째 수는 첫 번째 수의 왼쪽에 놓는다.그리고 상9에서 3, 나머지 0을 제외하면 세 번째는 첫 두 개의 수의 맨 왼쪽에 있다.마지막 3을 4로 나누면 나머지는 3이기 때문에 네 번째 수는 앞의 세 번째 수의 네 번째 빈자리, 즉 맨 오른쪽에 놓아야 한다.
 
 
 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 /* A! 
 5  * Algorithm Description
 6  *  
 7  * 
 8  */
 9 public class Al2 {
10     private int factorial(int n){
11         int sum=1;
12         for(int i=1;i<=n;i++){
13             sum*=i;
14         }
15         return sum;
16     }
17     private void insert(int pos, char ch, char []cArr){
18         if(cArr[pos]!=' '){
19             for(int i=cArr.length-1;i>pos;i--){
20                 cArr[i]=cArr[i-1];
21             }
22             cArr[pos]=ch;
23         } else{
24             cArr[pos]=ch;
25         }
26     }
27     private void solve(String str){
28         int n=str.length();
29         int m=factorial(n);
30         int []num=new int[n-1];
31         char []cArr=new char[n];
32         int i,j;
33         for(i=0;i){
34             Arrays.fill(cArr, ' ');
35             cArr[0]=str.charAt(0);
36             int c=i;
37             for(j=2;j<=n;j++){
38                 num[j-2]=c%j;
39                 c=c/j;
40             }
41             //System.out.print(Arrays.toString(num)+" ");
42             for(j=0;j){
43                 insert(num[j],str.charAt(j+1),cArr);
44             }
45             //System.out.println("i="+(i+1)+": "+Arrays.toString(cArr));
46         }
47     }
48     public static void main(String args[]){
49         Scanner sc=new Scanner(System.in);
50         long startTime=System.currentTimeMillis();
51         new Al2().solve(sc.nextLine());
52         long endTime=System.currentTimeMillis();
53         System.out.println("Time cost: "+(endTime-startTime));
54     }
55 }

 
 
 
 
다음으로 전송:https://www.cnblogs.com/gaoqichao/archive/2012/07/19/2600001.html

좋은 웹페이지 즐겨찾기