藍橋杯決賽真題——排列序數

標題:排列序數

   如果用a b c d4個字母組成一個串,有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;
    }
}

 


發佈了27 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章