描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926
方法一:
public static int getSortNum(String value) { // 记录已经出现过得字符和未出现的字符顺序 String sort = "abcdefghijkl"; // 记录结果数 int res = 1; for(int i=0;i<value.length();i++) { // 依次取各位的字符 char c = value.charAt(i); // 查看该字符在所有字符中的当前顺序 int head = sort.lastIndexOf(c); // 计算排在前面的字符串数量 res += ((head-i)*factorial(11-i)); // 修改字符顺序,将当前出现的字符,交换到字符最前面 // 因为我们不关心已经出现过得字符的顺序,我们只要知道出现过哪些字符以及未出现的字符的字典序 // 所以直接把出现过得字符扔到最前面就可以了 sort = change(sort, head); } return res; } /** * 求阶乘 * @param i * @return */ public static int factorial(int i) { if(i==0) return 0; int result = 1; for(;i>1;i--) { result *= i; } return result; } /** * 将字符串第a位换到最前面 * @param str * @param a * @param b * @return */ public static String change(String str,int a) { char[] chars = str.toCharArray(); char temp = chars[a]; for(int i=a;i>0;i--) { chars[i] = chars[i-1]; } chars[0] = temp; return String.valueOf(chars); } 方法二: static Scanner scan=new Scanner(System.in); public static void main(String[] args){ //这个是对的,只是耗时特别长,但让考试时这样写肯定得不了分。 Test08_2 test8=new Test08_2(); int a=scan.nextInt(); while(a>0){ test8.start(); a--; } } public void start(){ //这个是对的,只是耗时特别长,但让考试时这样写肯定得不了分。 String a=scan.next(); String b="abcde"; char[] c=b.toCharArray(); sort(c,0,a); sum=0; a2=0; } int sum=0; int a2=0; public void sort(char[] a,int b,String d){ if(a2==-1){ return; } if(b==a.length-1){ sum++; String c=String.valueOf(a); if(c.equals(d)){ a2=-1; System.out.println(sum); } return; } for(int i=b;i<a.length;i++){ char temp=a[i]; a[i]=a[b]; a[b]=temp; if(b<a.length-2){ String b1=String.valueOf(a); String b2=b1.substring(b+1, a.length); char[] b3=b2.toCharArray(); Arrays.sort(b3); String b5=""; for(int i1=0;i1<b+1;i1++){ b5+=a[i1]; } String b4=b5+""+String.valueOf(b3); a=b4.toCharArray(); } sort(a,b+1,d); temp=a[i]; a[i]=a[b]; a[b]=temp; } }方法三: public class Test08_3 { public static long postion (int n){ if(n==1){ return 1; } return n*postion(n-1); } public static long index(char[] p,char c,int inde){ int size=1; for (int i = 0; i < inde; i++) { if(c-p[i]>0){ size++; } } return (c-96)-size; } public static long getSize(char[] p,int index,long size){ char c=p[index]; if(index==p.length-1){ return 1; } long num=index(p, c, index)*postion(12-index-1); return num+getSize(p, ++index, num); } public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); sc.nextLine(); for (int i = 0; i < n; i++) { String str=sc.nextLine(); char [] cc=str.toCharArray(); System.out.println(getSize(cc, 0, 0)); } }