標題:排列序數
如果用a b c d這4個字母組成一個串,有4!=24種,如果把它們排個序,每個串都對應一個序號:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
現在有不多於10個兩兩不同的小寫字母,給出它們組成的串,你能求出該串在所有排列中的序號嗎?
【輸入格式】
一行,一個串。
【輸出格式】
一行,一個整數,表示該串在其字母所有排列生成的串中的序號。注意:最小的序號是0。
例如:
輸入:
bdca
程序應該輸出:
11
再例如:
輸入:
cedab
程序應該輸出:
70
資源約定:
峯值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
題解:
import java.util.*;
public class Main4 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s=sc.nextLine();
int q[]=new int[10]; //q[]表示的是i個字母全排列
q[0]=1;
for(int i=1;i<10;i++) {
q[i]=i*q[i-1]; //i個字母的全排列等於i的階乘
}
int sum=0; //表示該串在其字母所有排列生成的串中的序號
for(int i=0;i<s.length();i++) {
int k=0; //k表示有多少個小的在前面
for(int j=0;j<i;j++) {
if(s.charAt(j)<s.charAt(i))
k++;
}
sum=sum+q[s.length()-i-1]*(s.charAt(i)-'a'-k); //q[s.length()-i-1]表示第i個字母后面還有幾個字母,如bdca中的b字母后還有dca三個字母
//s.charAt(i)-'a'-k 表示用當前字母減去‘a’,再減去前面比這個字母小的字母的個數,比如如bdca中的b字母前還有a這一個字母。
}
System.out.println(sum);
}
}
這是另一個程序
//輸入一串字符,比如abcde,輸出它的全排列
import java.util.*;
public class Main4 {
private static ArrayList<String> list=new ArrayList<String>();
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine(); //接收輸入的字符串
char data[]=s.toCharArray(); //將輸入的字符串轉化爲字符數組
f(data,0);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public static ArrayList<String> f(char data[],int k) {
StringBuffer sb=new StringBuffer();
if(k==data.length) {
for(int i=0;i<data.length;i++)
sb.append(data[i]);
String s=sb.toString();
list.add(s);
}
for(int i=k;i<data.length;i++){
{char t=data[k];data[k]=data[i];data[i]=t;}
f(data,k+1);
{char t=data[k];data[k]=data[i];data[i]=t;} //回溯
}
return list;
}
}