java实现全排列输出
最近在找工作,面试java程序员或者软件工程师,在笔试的时候常常见到这么一道题:全排列的输出数组(常常要求是整数),其实这道题不难,主要是递归调用,在baidu或者google上已经有很多人提出了解法,但是大部分可读性很差,让我们莘莘学子根本就记不住。我来简单的说一下:
其实这个问题的解法基本思路是这样的:递归
但是我们在使用递归的时候要注意结束条件,也就是递归到最后,要推出递归方法,目前网上的主要思路如下:
public 递归方法(参数列表){
if(列表的元素只有两个){
输出:“元素一元素二”
输出:“元素二元素一”
}else{
//此时元素有两个以上,这时候要使用递归
递归方法(参数列表)//使用递归方法将元素细分
}
}
我这个思路是在百度上看到的,但是具体链接和源代码我再没找到,因为那个代码很乱……Sorry!
我在Eclipse实现了这个思路,代码如下:
import java.util.LinkedList;
import java.util.List;
public class ListAllPrint {
/**
* 使用createList方法,填充参数列表传递过来的List,默认是Integer,一般是这个类型,你可以修改别的类型
*/
public void createList(int n,List list){
if(n==0){//当是n=0是,默认就是3了
n=3;
}
for(int i=1;i<=n;i++){//for循环填充list
list.add(i);
}
}
/**
* printAll是输出全排列的递归调用方法,list是传入的list,用LinkedList实现,而prefix用于转载以及输出的数据
*/
public void printAll(List candidate, String prefix){
if(candidate.size()==1){
//一个元素时候,输出……;不过这个实现,这个if传递不到递归中,仅仅是测试代码中list的size为1时调用一次
System.out.println(candidate.get(0));
}
if(candidate.size()==2){
//输出两个元素时候,颠倒顺序
System.out.println(prefix+candidate.get(0)+candidate.get(1));
System.out.println(prefix+candidate.get(1)+candidate.get(0));
}else{
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);
printAll(temp, prefix + temp.remove(i));//递归调用
}
}
}
/**
* 测试代码
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Integer> list=new LinkedList<Integer>();
ListAllPrint lap=new ListAllPrint();
lap.createList(3, list);
lap.printAll(list,"");
}
}
我在编写这个程序的时候,发现自己要写一个
if(candidate.size()==1){
//一个元素时候,输出……;不过这个实现,这个if传递不到递归中,仅仅是测试代码中list的size为1时调用一次
System.out.println(candidate.get(0));
}
语句,用来当list初始就为size就为1时使用。我觉得这个效率很差,不仅每次递归也判断,而且不符合递归的思想:递归到最后应该是一个元素(查找算法递归实现最后是一个元素的判断)
所以,我又添加了一个参数在递归的方法中,用来记录原list的长度,使得每次的排列字符串输出可以完全记载到第二个参数prefix,不使用2,而是使用length来判断是否加最后一个元素入prefix,从而结束输出,从而使代码显得漂亮多了。修改如下:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListAllPrint2 {
/**
* 使用createList方法,填充参数列表传递过来的List,默认是Integer,一般是这个类型,你可以修改别的类型
*/
public void createList(int n,List list){
if(n==0){
n=3;
}
for(int i=1;i<=n;i++){
list.add(i);
}
}
/**
* printAll是输出全排列的递归调用方法,list是传入的list,用LinkedList实现,
* 而prefix用于转载以及输出的数据
* length用于记载初始list的长度,用于判断程序结束。
*/
public void printAll(List candidate, String prefix,int length){
if(prefix.length()==length)
System.out.println(prefix);
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);
printAll(temp, prefix + temp.remove(i),length);
}
}
/**
* 测试代码
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> list=new ArrayList<Integer>();
ListAllPrint2 lap=new ListAllPrint2();
lap.createList(3, list);
lap.printAll(list,"",list.size());
}
}
这样子看上去漂亮多了!
呵呵,相关的project文件如下,这两个class都在一个项目下:
希望能对大家有所帮助!
分享到:
相关推荐
在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,并在每一步中检查当前的解...
在Java编程中,全排列是一个常见的问题,它涉及到算法和数据结构的知识。全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。...
题目描述:给定一个数列a1,a2,a3…an,输出他所有的全排列。 算法设计描述: 1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前...
Java基于递归解决全排列问题算法示例 全排列问题是指对一个集合中的元素进行全排列的操作,例如,对于集合{1, 2, 3},其全排列为{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}、{3, 2, 1}。在Java中,...
在Java中实现重复元素全排列,通常采用递归的方法。核心思想是通过交换元素的位置来生成不同的排列组合,并检查每次交换是否产生了一个新的、未被记录的排列。为了避免重复计算,可以使用一个辅助函数`Judge()`来...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的...以上就是关于如何使用回溯法输出自然数1到n的所有不重复排列(即n的全排列)的详细介绍及Java实现。希望对读者理解回溯法及其应用有所帮助。
简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。
"java实现字符串的全排列" java实现字符串的全排列是指通过编程语言java来生成一个字符串的所有可能排列。例如输入字符串abc,则输出所有可能的排列组合:abc,acb,bac,bca,cab和cba。 在java中,实现字符串的...
同时,为了保持输出的有序性,可以按照某种规则(如数字升序或降序)来插入新元素。 在给定的“Print_all”文件中,很可能包含了具体实现这个算法的代码。通过分析和理解这段代码,你可以进一步了解如何使用非递归...
2. 在递归函数的基线条件中,当所有元素都被使用时,输出当前排列,表示找到一个全排列。 3. 对于每个未使用的元素,将其添加到当前排列中,然后对剩余的未使用元素调用递归函数。 4. 在递归调用返回后,将最后添加...
在Java编程中,实现n位数字的全排列是一项常见的算法问题。全排列是指从n个不同元素中取出n个元素,按照一定顺序排列的所有可能的组合。每一种排列都是唯一的,且总数为n的阶乘(n!)。这个问题通常通过递归的方式来...
### Java编写的递归算法的经典事例:全排列输出 #### 概述 本文将详细介绍一个用Java编写的递归算法实例,该实例用于实现字符数组的所有可能全排列。通过这个例子,我们可以深入理解递归的基本概念、工作原理以及...
### 全排列II (Java代码) #### 知识点概览 1. **回溯算法原理及应用**:介绍回溯算法的基本概念及其在解决全排列问题中的应用。 2. **排序与剪枝策略**:解释为什么需要对输入数组进行排序,并如何利用排序后的...
全排列是组合数学中的一个重要概念,它指的是从n个不同元素中取出n个元素,并按照一定的顺序排列起来的所有可能方式。在本示例中,我们使用了编程来生成1到n的所有全排列,这里主要涉及到了回溯法(Backtracking)这...
### 全排列——递归排序和字典序列 在计算机科学与编程领域中,全排列是一种重要的算法,它被广泛应用于解决多种问题,如组合优化、密码学等。本文将详细介绍两种实现全排列的方法:递归排列和字典序排列,并通过...
"曲文杰—运行结果.png"可能是这个程序运行的输出结果示例,显示了预期的全排列序列。 总之,字典排序求全排列的算法通过Java实现,结合了回溯法和深度优先搜索策略,遵循字典序规则生成所有可能的排列。理解并掌握...
示例:输入: [1,2,3]输出:public class Arrange {//排列数组 k-m 的元素public void method(int[] ar
网易游戏笔试题算法题之一,可以用C++,Java,Python,由于Python代码量较小,于是我选择Python语言。 算法总体思路是从1,2,3……N这个排列开始,一直计算下一个排列,直到输出N,N-1,……1为止 那么如何计算给定排列...
代码可能以Python、C++、Java等常见编程语言编写,通过遍历所有可能的元素组合来输出所有可能的排列。 全排列的应用场景包括但不限于: - 排序问题:例如,找出所有可能的排序结果。 - 图像处理:例如,寻找所有...
本资源提供了蓝桥杯Java历年真题及答案的整理, 涉及到了Java编程语言的多个方面,包括算法、数据结构、输入/输出操作等。 在资源的部分内容中,我们可以看到一个字符排序算法的实现,该算法可以将N个不同字符...