`
easonfans
  • 浏览: 254056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 全排列输出

阅读更多

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都在一个项目下:

希望能对大家有所帮助!

分享到:
评论
5 楼 fsead 2012-03-30  
挺不错的 研究一下
4 楼 okjesse 2010-01-23  
package test;
import java.util.Arrays;
public class ListAll {
	static String[] listMe = {"2","1","3","5","7"};
	static int listMeLen = listMe.length;
	public static void list(String insert,String[] inserted) {
		int insertedLen = inserted.length,
			tempInsertedLen = insertedLen + 1;
		String tempInserted[] = new String[tempInsertedLen];
		for (int i = 0; i < tempInsertedLen; i++) {
			System.arraycopy(inserted,0,tempInserted,0,i);
			tempInserted[i] = insert;
			System.arraycopy(inserted,i,tempInserted,i+1,tempInsertedLen - i - 1);
			if (tempInsertedLen == listMeLen)
				System.out.println(Arrays.asList(tempInserted));
			else
				list(listMe[tempInsertedLen],tempInserted);
		}
	}
	public static void main(String[] args) {
		list(listMe[1],new String[]{listMe[0]});
	}
}

照楼主思路也写了下!
3 楼 piao_bo_yi 2010-01-11  
关于全组合输出的,怎么做??
2 楼 zxxxxz 2010-01-06  
不管有多难 也要学会
1 楼 piao_bo_yi 2009-12-10  
这题挺难的。

相关推荐

    java递归实现N个数全排列输出

    在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,并在每一步中检查当前的解...

    Java实现字符数组全排列的方法

    在Java编程中,全排列是一个常见的问题,它涉及到算法和数据结构的知识。全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。...

    用java语言实现数字全排列

    题目描述:给定一个数列a1,a2,a3…an,输出他所有的全排列。 算法设计描述: 1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前...

    Java基于递归解决全排列问题算法示例

    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所有不重复的排列,即n的全排列

    根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的...以上就是关于如何使用回溯法输出自然数1到n的所有不重复排列(即n的全排列)的详细介绍及Java实现。希望对读者理解回溯法及其应用有所帮助。

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    java实现字符串的全排列

    "java实现字符串的全排列" java实现字符串的全排列是指通过编程语言java来生成一个字符串的所有可能排列。例如输入字符串abc,则输出所有可能的排列组合:abc,acb,bac,bca,cab和cba。 在java中,实现字符串的...

    全排列-非递归算法

    同时,为了保持输出的有序性,可以按照某种规则(如数字升序或降序)来插入新元素。 在给定的“Print_all”文件中,很可能包含了具体实现这个算法的代码。通过分析和理解这段代码,你可以进一步了解如何使用非递归...

    计算机数据结构-全排列回溯算法-java

    2. 在递归函数的基线条件中,当所有元素都被使用时,输出当前排列,表示找到一个全排列。 3. 对于每个未使用的元素,将其添加到当前排列中,然后对剩余的未使用元素调用递归函数。 4. 在递归调用返回后,将最后添加...

    Java实现n位数字的全排列

    在Java编程中,实现n位数字的全排列是一项常见的算法问题。全排列是指从n个不同元素中取出n个元素,按照一定顺序排列的所有可能的组合。每一种排列都是唯一的,且总数为n的阶乘(n!)。这个问题通常通过递归的方式来...

    java编写的递归算法的经典事例

    ### Java编写的递归算法的经典事例:全排列输出 #### 概述 本文将详细介绍一个用Java编写的递归算法实例,该实例用于实现字符数组的所有可能全排列。通过这个例子,我们可以深入理解递归的基本概念、工作原理以及...

    全排列ⅱ(java代码).docx

    ### 全排列II (Java代码) #### 知识点概览 1. **回溯算法原理及应用**:介绍回溯算法的基本概念及其在解决全排列问题中的应用。 2. **排序与剪枝策略**:解释为什么需要对输入数组进行排序,并如何利用排序后的...

    输出1到n的所有排列

    全排列是组合数学中的一个重要概念,它指的是从n个不同元素中取出n个元素,并按照一定的顺序排列起来的所有可能方式。在本示例中,我们使用了编程来生成1到n的所有全排列,这里主要涉及到了回溯法(Backtracking)这...

    全排列——递归排序和字典序列

    ### 全排列——递归排序和字典序列 在计算机科学与编程领域中,全排列是一种重要的算法,它被广泛应用于解决多种问题,如组合优化、密码学等。本文将详细介绍两种实现全排列的方法:递归排列和字典序排列,并通过...

    字典排序求全排列的算法

    "曲文杰—运行结果.png"可能是这个程序运行的输出结果示例,显示了预期的全排列序列。 总之,字典排序求全排列的算法通过Java实现,结合了回溯法和深度优先搜索策略,遵循字典序规则生成所有可能的排列。理解并掌握...

    86God#LeetCodeHot100#Java SE之全排列1

    示例:输入: [1,2,3]输出:public class Arrange {//排列数组 k-m 的元素public void method(int[] ar

    非递归的输出1-N的全排列实例(推荐)

    网易游戏笔试题算法题之一,可以用C++,Java,Python,由于Python代码量较小,于是我选择Python语言。 算法总体思路是从1,2,3……N这个排列开始,一直计算下一个排列,直到输出N,N-1,……1为止 那么如何计算给定排列...

    quanpailie.rar_全排列

    代码可能以Python、C++、Java等常见编程语言编写,通过遍历所有可能的元素组合来输出所有可能的排列。 全排列的应用场景包括但不限于: - 排序问题:例如,找出所有可能的排序结果。 - 图像处理:例如,寻找所有...

    蓝桥杯java历年真题及答案整理.doc

    本资源提供了蓝桥杯Java历年真题及答案的整理, 涉及到了Java编程语言的多个方面,包括算法、数据结构、输入/输出操作等。 在资源的部分内容中,我们可以看到一个字符排序算法的实现,该算法可以将N个不同字符...

Global site tag (gtag.js) - Google Analytics