字典序输出不重复的全排列

今天下午参加某公司笔试时遇到的一道题,分享给大家:

题意如下:
现在给你一个字符数组,以及一个字符串长度限制(char[] arr, 2)。已知这个字符数组内的字符就是密码,现在让你输出所有的密码,密码不可重复,也不会出现重复字符,为了便于知道输出密码的正确性,我们会对程序输出结果进行一一比较,为了比较简单,请按照字典序输出。

题目的核心意思就是这,只不过它给的题读起来要比这感觉绕一点,第一次读可能会让你感觉不知道如何下手。所以大家遇到题目比较长的情况,就静下心来,对照题目看给出的例子,试着用自己的文字或者核心公式算法将题目简化。

简化完成后,我相信大部分人都可以看出这题是回溯算法来做。因为很明显就是一个排列组合问题啊。只不过按照字典序排,每一个组合中不能有重复字符,仅此而已。

我们来回顾一下回溯法。回溯法无非就是三步走:
1、确定方法有无返回值以及参数列表
本题中要找全部组合,那么直接在类中定义列表来存储即可,所以方法不需要返回值。而参数列表是需要的,毕竟我们需要字符数组,给定的长度值,现有的组合长度值。
2、什么时候终止递归调用回溯。
当现有长度值等于给定长度值时,终止回溯。当大于长度值时更终止回溯
3、单层逻辑
就是从第一个字符开始循环,先判断字符列表中有没有该字符,有就跳过,没有再调用递归,放入列表,最后记得删去该值回溯。并且这个单层循环每次都从头开始,即从0开始。

目前为止,不包含重复字符的全排列我们已经找到了,现在就是要按照字典序了,你当然可以在这个全排列列表中比较字典序排序,这里我们使用一个取巧的办法:你直接对字符数组进行字典序排序。这样输出的列表就是按照字典序排好的。

public class 字典序输出不重复的全排列 {

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param seed char字符型一维数组 字符种子
     * @param size int整型 验证码长度
     * @return string字符串一维数组
     */
    List<String> list = new ArrayList<>();
    //     String[] st;
    StringBuilder str = new StringBuilder();
    List<Character> li = new ArrayList<>();
    public String[] Permutation (char[] seed, int size) {
        // write code here
        Arrays.sort(seed);
        Test(seed, 0, size);

        String[] st = new String[list.size()];
        for(int i = 0; i < list.size(); i++){
            st[i] = list.get(i);
        }

        return st;
    }

    void Test(char[] seed, int count, int size){
        if(count == size){
            for(int i = 0; i < li.size(); i++){
                str.append(li.get(i));
            }
            list.add(str.toString());
            str.delete(0, str.length());
        }
        if(count > size){
            return;
        }

        count += 1;
        for(int i = 0; i < seed.length; i++){
            if( li.contains(seed[i])){
                continue;
            }
            li.add(seed[i]);
            Test(seed, count, size);
            li.remove(li.size()-1);
        }
    }

    public static void main(String[] args) {
        char[] seed = new char[]{'0','1','2'};
        String[] st = new 字典序输出不重复的全排列().Permutation(seed, 2);
        for(String s : st){
            System.out.println(s);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值