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

题意如下:
现在给你一个字符数组,以及一个字符串长度限制(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 hereArrays.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 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...

  2. C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。

    最近遇到一道题目:多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好. 举个例子: input:qwer qwer sdfgh output:qwer 题意大致就是这样,下面给出我 ...

  3. hdu 1027 输出第m个全排列(next_permutation)

    Sample Input 6 4 //输出第4个全排列 11 8 Sample Output 1 2 3 5 6 4 1 2 3 4 5 6 7 9 8 11 10 1 # include <c ...

  4. python练习-Python输出不重复的字符

    #Python输出不重复的字符#输入一个字符串,把最左边的10个不重复的字符(大小写算不同字符)挑选出来 #如果不重复的字符不到10个,则按实际数目输出 #输入格式:输入一个字符串s #输出格式:输出 ...

  5. Python---按字典序输出集合的所有非空子集

    Python---按字典序输出集合的所有非空子集 通过使用模拟二进制减法以判断每次选取的具体元素.其中flag[ ]为模拟二进制数,初始化全为1,当flag[0]为0时结束循环.下标为0位不作为选取( ...

  6. Java生成随机数并随机输出不重复的值

    一个小Demo,网上有很多类似的代码,测试了一下网上的代码为了让随机输出值不重复,重复循环达到目的的效果,但循环次数过多严重影响性能. 通过ArrayList的remove方法实现了生成随机数并随机输 ...

  7. 素因子分解表+重复元素全排列问题

    素因子分解表+重复元素全排列问题 如果要求解重复运算的全排列问题,最朴素的方法是先求n!,再求重复元素m1,m2,m3的m1!,m2!,m3!,然后再做除法,但这样写很容易爆时间和爆空间. 所以这里聊 ...

  8. python全排列字典序输出 递归_递归实现全排列,字典序法实现全排列

    问题:全排列的递归实现 编程思想: 用1 2 3为例,全排列结果为123,132,213,231,321,312  根据全排列的找到规律 1.将当前元素与后面位置的每个元素依此交换 2.交换后取后一个 ...

  9. python全排列字典序输出 递归_全排列-字典序列、递归方法c语言实现

    当前位置:我的异常网» C语言 » 全排列-字典序列.递归方法c语言实现 全排列-字典序列.递归方法c语言实现 www.MyException.Cn  网友分享于:2014-04-20  浏览:4次 ...

最新文章

  1. scp遇到路径中有空格
  2. oracle scn与数据恢复,SCN与数据库恢复的关系
  3. 100%的程序员都想挑战的算法趣题!| 码书
  4. 斯坦福大学开发自主无人机摄影的算法,可显著提高电影中无人机镜头品质
  5. element table固定表头,表的高度自适应解决方法
  6. 有备无患的Linux操作系统备份方法
  7. 2020-11-06 Python OpenCV给证件照换底色
  8. python入门之控制结构-循环结构_Python 入门之控制结构 - 循环结构(一)
  9. Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...
  10. mongodb可视化管理工具_对我来说数据库图形化管理工具用这个足够了
  11. ruby 集合 分组_在Ruby中找到两个集合之间的区别
  12. [原创]BizTalk动手实验系列目录
  13. #pragma预处理指令详解
  14. ESRI.ArcGIS.Controls.AxMapControl
  15. Java不能做游戏?快来看看这个Java版超级玛丽吧。
  16. 深入理解ext2文件系统
  17. ubuntu独立显卡驱动
  18. 卖辣椒包的也要IPO:给肯德基们“打工”,但志不在此
  19. Excel巧做项目管理
  20. Python 生成excel表格

热门文章

  1. 为什么梯度是上升方向,梯度下降要取负?
  2. DefaultMQPushConsumer 使用示例与注意事项
  3. 亮风台提出基于图形匹配的可变形表面跟踪新算法 | ICCV 2019
  4. 联想c245如何使用html,[转载]联想C245一体机电脑改XP成功,REALTEK ALC269声卡正常驱动...
  5. 用模式识别实现围棋转接器的开源Java项目——一个类似GTool2.exe的工具
  6. 网传21个最“坑”调剂院校,考研er慎重选择!
  7. 【web前端】如何运行第一个vue.js程序,尝试运行官方指导案例
  8. 百度Apollo6.0中Overlap.proto每个字段的含义
  9. mvn archetype:create-from-project报错The specified user settings file does not exist
  10. Linux系统移植——Linux下USB存储设备操作