java实现全排列输出
java实现全排列输出
转自:http://easonfans.iteye.com/blog/517286
最近在找工作,面试java程序员或者软件工程师,在笔试的时候常常见到这么一道题:全排列 的输出数组(常常要求是整数),其实这道题不难,主要是递归调用,在baidu或者google上已经有很多人提出了解法,但是大部分可读性很差,让我们 莘莘学子根本就记不住。我来简单的说一下:
其实这个问题的解法基本思路是这样的:递归
但是我们在使用递归的时候要注意结束条件,也就是递归到最后,要推出递归方法,目前网上的主要思路如下:
1 public 递归方法(参数列表){
2 if(列表的元素只有两个){
3 输出:“元素一元素二”
4 输出:“元素二元素一”
5 }else{
6 //此时元素有两个以上,这时候要使用递归
7 递归方法(参数列表)//使用递归方法将元素细分
8 }
9 }
我这个思路是在百度上看到的,但是具体链接和源代码我再没找到,因为那个代码很乱……Sorry!
我在Eclipse实现了这个思路,代码如下:
1 import java.util.LinkedList;
2 import java.util.List;
3
4
5 public class ListAllPrint {
6 /**
7 * 使用createList方法,填充参数列表传递过来的List,默认是Integer,一般是这个类型,你可以修改别的类型
8 */
9 public void createList(int n,List list){
10 if(n==0){//当是n=0是,默认就是3了
11 n=3;
12 }
13 for(int i=1;i<=n;i++){//for循环填充list
14 list.add(i);
15 }
16 }
17 /**
18 * printAll是输出全排列的递归调用方法,list是传入的list,用LinkedList实现,而prefix用于转载以及输出的数据
19 */
20 public void printAll(List candidate, String prefix){
21 if(candidate.size()==1){
22 //一个元素时候,输出……;不过这个实现,这个if传递不到递归中,仅仅是测试代码中list的size为1时调用一次
23 System.out.println(candidate.get(0));
24 }
25 if(candidate.size()==2){
26 //输出两个元素时候,颠倒顺序
27 System.out.println(prefix+candidate.get(0)+candidate.get(1));
28 System.out.println(prefix+candidate.get(1)+candidate.get(0));
29 }else{
30 for (int i = 0; i < candidate.size(); i++) {
31 List temp = new LinkedList(candidate);
32 printAll(temp, prefix + temp.remove(i));//递归调用
33 }
34 }
35 }
36
37 /**
38 * 测试代码
39 */
40 public static void main(String[] args) {
41 // TODO Auto-generated method stub
42 LinkedList<Integer> list=new LinkedList<Integer>();
43 ListAllPrint lap=new ListAllPrint();
44 lap.createList(3, list);
45 lap.printAll(list,"");
46 }
47 }
我在编写这个程序的时候,发现自己要写一个:
1 if(candidate.size()==1){
2 //一个元素时候,输出……;不过这个实现,这个if传递不到递归中,仅仅是测试代码中list的size为1时调用一次
3 System.out.println(candidate.get(0));
4 }
语句,用来当list初始就为size就为1时使用。我觉得这个效率很差,不仅每次递归也判断,而且不符合递归的思想:递归到最后应该是一个元素(查找算法递归实现最后是一个元素的判断)
所以,我又添加了一个参数在递归的方法中,用来记录原list的长度,使得每次的排列字符串输出可以完全记载到第二个参数prefix,不使用2,而是使用length来判断是否加最后一个元素入prefix,从而结束输出,从而使代码显得漂亮多了。修改如下:
1 import java.util.ArrayList;
2 import java.util.LinkedList;
3 import java.util.List;
4
5
6 public class ListAllPrint2 {
7 /**
8 * 使用createList方法,填充参数列表传递过来的List,默认是Integer,一般是这个类型,你可以修改别的类型
9 */
10 public void createList(int n,List list){
11 if(n==0){
12 n=3;
13 }
14 for(int i=1;i<=n;i++){
15 list.add(i);
16 }
17 }
18 /**
19 * printAll是输出全排列的递归调用方法,list是传入的list,用LinkedList实现,
20 * 而prefix用于转载以及输出的数据
21 * length用于记载初始list的长度,用于判断程序结束。
22 */
23 public void printAll(List candidate, String prefix,int length){
24 if(prefix.length()==length)
25 System.out.println(prefix);
26 for (int i = 0; i < candidate.size(); i++) {
27 List temp = new LinkedList(candidate);
28 printAll(temp, prefix + temp.remove(i),length);
29 }
30 }
31
32 /**
33 * 测试代码
34 */
35 public static void main(String[] args) {
36 // TODO Auto-generated method stub
37 ArrayList<Integer> list=new ArrayList<Integer>();
38 ListAllPrint2 lap=new ListAllPrint2();
39 lap.createList(3, list);
40 lap.printAll(list,"",list.size());
41 }
42 }
这样子看上去漂亮多了!
呵呵,相关的project文件如下,这两个class都在一个项目下:
希望能对大家有所帮助!
java实现全排列输出的更多相关文章
- n全排列输出和 n个数的组合(数字范围a~b)
n全排列输出: int WPermutation(int num, bool bRepeat) num表示num全排列 bRepeat标志是否产生重复元素的序列. int Permutation(in ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...
- Java数字格式化输出时前面补0
Java数字格式化输出时前面补0 星期日 2014年11月30日| 分类: Java /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...
- Java自定义日志输出文件
Java自定义日志输出文件 日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别.打印形式和日志的输出路径 ...
- Java中直接输出一个类的对象
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...
- 【JAVA零基础入门系列】Day7 Java输入与输出
[JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...
- Java中如何输出对勾,ASCII编码与字符串相互转换
Java中如何输出对勾? 最简单的方法是,从那个地方拷贝一个对勾的字符,然后System.out.println("√"); 但是心里总会担心,万一机器不认这个字符该怎么办?(可能 ...
- Java-Runoob-高级教程-实例-数组:05. Java 实例 – 数组输出
ylbtech-Java-Runoob-高级教程-实例-数组:05. Java 实例 – 数组输出 1.返回顶部 1. Java 实例 - 数组输出 Java 实例 以下实例演示了如何通过循环输出数 ...
- JS实现的数组全排列输出算法
本文实例讲述了JS实现的数组全排列输出算法.分享给大家供大家参考.具体分析如下: 这段js代码对数组进行全排列输出,改进了一些老的代码 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来, ...
随机推荐
- 图像处理算法的仿真平台之VGA时序
一 概述 图像处理算法一般是用matla或OpenCV实现的,若是用FPGA实现,设计思路差别极大.matlab和opencv的优势:这些工具的优势在于可以方便地载入图像文件,或输出数据到图像文件, ...
- sql-5-事务,索引
事务 1.ACID概念 原子性(Atomicity) 要么都成功,要么都失败 一致性(consistency) 事务前后的数据完整性保持一致 持久性(Durability) 事务一旦提交则不可逆,持久 ...
- pycharm基础使用入门
pycharm基础使用入门 输出 print函数 print('hello world') 右键选择run或者右上角的三角形运行,可以运行出结果 "E:\all sorts of learn ...
- kafka单机环境配置以及基本操作
安装地址(已亲测有效):https://www.linuxidc.com/Linux/2019-03/157650.htm
- via浏览器和Alook浏览器插件安装
via和Alook是Android和IOS上可以支持JS插件的浏览器,一些常用的插件可以在via-app.cn上找到.但总会有人会思考点击安装按钮的是怎样将JS脚本代码安装到浏览器的. 经过对页面代码 ...
- 关于 .NET 与 JAVA 在 JIT 编译上的一些差异
最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...
- PostgreSQL-WITH AS短语
WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表.在WITH子句中的每一个辅助语句可以是一个SELEC ...
- 正则:支持6-20位数字、字母和特殊字符(仅限!@#$%^&*())
checkpwd(newpsd); function checkpwd() { var newpsd = $(":input[name='newpsd']").val(); var ...
- Typora PicGo Gitee博客写作好搭档
利用Gitee仓库存放图片 1.首先在Gitee上创建一个公开的仓库,我这里创建了一个名叫resources的仓库: 2.在Gitee中获取私人令牌(个人设置界面中): 安装配置PicGo 1.下载自 ...
- 大数据学习(08)—— Hive简介
前面的Hadoop学习是非常体系化的,有主线有细节.到了Hive这里,知识点非常零散,感觉没有什么主线能把它串起来.从官方网站上就能看出这点差异. 什么是Hive Hive是一个基于Hadoop的企业 ...