public class Main7 { public static final int[]fac = {1,1,2,6,24,120,720,5040,40320,362880}; public static void main(String[] args) { String str = "12345"; // 建立Hash表 , 得出num在 str这三个数字全排列中是第几个 String num1 = "12453"; System.out.println(getHash(num1, str)); // 逆Hash表 , 给出一个数字,得出他的顺序 int num2 = 16; System.out.println(reverHash(num2, str)); } private static String reverHash(int num, String str) { num--; boolean step[] = new boolean[str.length()]; StringBuffer sb = new StringBuffer(); int j,k; for (int i = 0; i < str.length(); i++) { int t = num / fac[str.length()-i-1]; num -= t * fac[str.length()-i-1]; for (j = 0, k = 0; k <= t; j++) if (!step[j]) k++; step[j-1] = true; sb.append(str.charAt(j-1)); } return sb.toString(); } private static int getHash(String num, String str) { int sum = 0; for (int i = 0; i < num.length(); i++) { int temp = 0; for (int j = i + 1; j < num.length(); j++) if (num.charAt(i) > num.charAt(j)) temp++; sum += temp * fac[str.length()-i-1]; } return sum+1; } }
原文:http://blog.csdn.net/first_sight/article/details/44628753