蓝桥杯决赛真题——排列序数

时间:2021-10-15 11:12:28

标题:排列序数

   如果用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;

}

}