递减进位制数法—全排列

来源:互联网 发布:js实现点击显示和隐藏 编辑:程序博客网 时间:2024/05/04 08:03
package permutation;import java.util.Scanner;public class DeclinePermutation {public int factorial(int n) {int sum = 1;while (n > 1) {sum *= (n--);}return sum;}// get initialization permutation of scale is numberpublic String creatPermutation(int number) {char[] ch = new char[number];for (int i = 1; i <= number; ++i)ch[i - 1] = (char) (i + 48);return String.valueOf(ch);}// get interNumber 0f original permutation numberpublic String getInterNumber(String permutation) {char[] ch = permutation.toCharArray();char[] save = new char[permutation.length() - 1];for(int i = 0 ; i < permutation.length() ; ++i){//digit 1 has no interNumberif(ch[i]=='1') continue;//save is type of char int count = 0 + 48;//count interNumber of the digit of position ifor(int j = i + 1; j < permutation.length() ;++j ) {if(ch[i] > ch[j]) ++count;}//put count to the  array save in correspondence positionsave[ch[i] - 48 - 2] = (char)count;}return String.valueOf(save);}//find next permutationpublic String nextInterNumber(String interNumber) {//System.out.print("interNumber = " + interNumber + " + 1 = ");char[] ch = interNumber.toCharArray();for(int i = interNumber.length() - 1; i >= 0 ;--i){int pow = i + 2;ch[i] += 1;//System.out.println("ch[" + i + "] = " + ch[i]);if(ch[i] >= pow + 48) ch[i] -= pow;else break;}//System.out.println("ch = " + String.valueOf(ch));//System.out.println(String.valueOf(ch));return String.valueOf(ch);}// get permutation via a interNumberpublic String getPermutation(String interNumber) {char[] ch = interNumber.toCharArray();char[] npm = new char[interNumber.length() + 1];// new permutation number// initialization of npmfor (int i = 0; i < interNumber.length() + 1; ++i)npm[i] = '0';// '0' represents spacefor (int i = interNumber.length() - 1; i >= -1; --i) {int digit = i + 2; // need to position// array index out of boundint count = 0;// make sure count = 0 while i = interNumber.length();if (i > -1) {count = (int) (ch[i] - 48);// char type to int type//System.out.println("count = " + count);}int j = interNumber.length();// from right to left traversewhile (count > 0 && j > 0) {if (npm[j--] == '0') {--count;}}while (j >= 0) {if (npm[j] == '0') {npm[j] = (char) (digit + 48);// int to charbreak;}--j;}}return String.valueOf(npm);}public void declinePermutationAlgorathim(String permutation) {int time = 0;// control loop stopwhile ((++time) <= factorial(permutation.length())) {char[] ch = permutation.toCharArray();for(int i= 0 ; i< permutation.length() ; ++i){System.out.print(ch[i] + " ");}/** find next permutation */ //original interNumberString original = getInterNumber(permutation);//next interNumberaString nextInterNumber = nextInterNumber(original);//update permutation with next permutationpermutation = getPermutation(nextInterNumber);System.out.println("\t" + original);}}public static void main(String[] args) {// TODO Auto-generated method stubDeclinePermutation dp = new  DeclinePermutation ();String per  = "83674521";String curInt = dp.getInterNumber(per);for(int j = 0 ; j < 1013 ; ++ j){curInt = dp.nextInterNumber(curInt);}System.out.println("curInt = " + curInt); per =dp.getPermutation(curInt); System.out.println("per = " + per);//System.out.println(dp.getInterNumber("839647521"));//System.out.println(dp.nextInterNumber(dp.getInterNumber("839647521")));//System.out.println(dp.getPermutation("12224400"));//System.out.println(dp.getPermutation("12224401"));//System.out.println(dp.nextInterNumber("0004"));Scanner scan = new Scanner(System.in);System.out.println("Please input scale of permutation: ");int scale = scan.nextInt();long start = System.currentTimeMillis();dp.declinePermutationAlgorathim(dp.creatPermutation(scale));long end = System.currentTimeMillis();System.out.println("Run time : " + (double)Math.round(end - start)/1000 + "second");}}

原创粉丝点击