蓝桥杯国赛之排列序数

题目:排列序数

如果用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.Arrays;  
import java.util.Scanner;  

public class Main {  
//  装输入的字符串的每一个字母
    public static char [] array;  
//  用来标记已经用过的字母
    public static boolean flag [];  
//    用来存放当前的字符串
    public static char[] all_P ; 
//    记录该串在所有排列中的序号
    public static int count = 0;  
    public static void main(String[] args) {  

        Scanner scan = new Scanner(System.in); 
//        string装的是原字符串
        String string = scan.next();  
//        将原字符串的每一个字母赋给array
        array = string.toCharArray();  
//       对array的元素进行从小到大的排序
        Arrays.sort(array);  
        System.out.println("array---" + array);
        for(char i: array)
        {
            System.out.print(i);
        }
        System.out.println();
//        初始化flag数组
        flag= new boolean[array.length];  
//        初始化装临时字符串的数组
        all_P = new char[array.length];  
//        开始DFS深搜,(起始索引,目标string)
        dfs(0,string);  
    }  
    private static void dfs(int n,String string) {  
//      是否满足与目标string比较的条件,
        if(n == array.length){  
//          当 DFS到与目标串string等长的时候,就比较string与临时字符串,如果目标串与临时串相等,就输出count
//          由题目可知,字符串在所有排列中的序号是从零开始的。
            if(string.equals(String.valueOf(all_P))){  
                System.out.println(count);  
            }  
//          System.out.println(String.valueOf(all_P)+ " " + count);  
//            计数
            count++;  
//            已经到最低层了,return返回上一层。
            return;  
        }  
//        for遍历;
//        if判断是否重复,false为不重复,未使用过的;        
//        如果不重复,则flag[i]置为true;
//        从源材料array[]中,选择索引为  i 的元素放到临时数组all_P[]的当前递归深度的索引n对应的元素中;
//        进入下一层DFS递归,(当前索引  + 1,目标string);
//        回退一步,将flag[i]置为false;
//        源    临时   目标
        for(int i = 0; i < array.length; i++){  
            if(!flag[i]){  
                flag[i] = true;  
                all_P[n] = array[i];  
                dfs(n+1, string);  
                flag[i] = false;  
            }  
        }  
    }  

}  

心得:

public class test
{
    public static void main(String[] args)
    {
        char[] a = { 'a', 'b' };
        System.out.println("ab".equals(a));
        System.out.println("ab".equals(String.valueOf(a)));
        System.out.println("OK");
    }
}

false
true
OK

char [] array  与  String string  进行比较
string.equals(String.valueOf(all_P))

Arrays.sort(array);


public class test
{
    public static void main(String[] args)
    {
        char[] a = {'e','g', 'b','d'};
        int[] b = {546, 3, 55, 77, 74};
        Arrays.sort(a);
        System.out.println(a);
        Arrays.sort(b);
        for(int i : b)
        {
            System.out.print(i + "  ");         
        }
        System.out.println();
        System.out.println("OK");
    }
}
利用Arrays.sort()  对数组元素进行排序
bdeg
3  55  74  77  546  
OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可持续化发展

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值