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

java程序员面试宝典7.4--输出几个数字所有不同的排列顺序

 
阅读更多
/**
 * 无重复全排列问题
 * 输出1,2,2,3,4这几个数字所有不同的排列顺序
 * 一个递归问题,想法是如果当前数字确定下来,后面的几位还有几种组合方式,逐步的缩小后面几位的规模
 *
 * 输出的完整性问题:定义一个result专门装前面排序好的元素,input里装的是后面顺序没有定下来的元素的集合,
 * layer是表示当前处理的是input中的第几位,每次input为空的时候,都把result里的元素都打印一下
 * 
 *无重复问题:如果在这个layer上,已经处理过一个跟当前元素值相同的元素,就把这个元素跳过去
 * @author justrun
 *
 */
public class plus {
	public static void main(String args[]){
		List<Integer> input = new LinkedList<Integer>();
		input.add(1);
		input.add(2);
		input.add(2);
		input.add(3);
		input.add(4);
		
		int[] result = new int[input.size()];
		print(input,0,result);
	}
	public static void print(List<Integer> input, int layer, int[] result){
		
		if(input.isEmpty()){                             //后面没排序的元素集合为空,输出一次result集合
			for(int i=0 ; i<5; i++){
				System.out.print(result[i]);
			}
			System.out.println("");
			return;
		}
		
		int flag;
		for(int i = 0 ; i<input.size() ; i++){
			
			int node = (Integer)input.get(i);
			
			flag = 0;                                     //同一位置,重复的数字只调用一次
			for(int n=0 ; n<i; n++){
				if( node == (Integer)input.get(n)){
					flag = 1; 
					break;
				}
			}
			
			if(flag == 0){
				result[layer]=node;
				List<Integer> newRefer = new LinkedList<Integer>();
				for(int j=0 ; j<input.size() ; j++){
					newRefer.add((Integer) input.get(j));
				}
				newRefer.remove(i);			            //深拷贝一个新的input集合,把正在处理的元素,从当前的input集合中拿掉
				print(newRefer,layer+1,result);
			}
		}
	}

 

1
3
分享到:
评论
10 楼 metaphy 2012-09-02  
使用HashMap来存储,可以去掉关于flag的那一段


import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class PlusTriple {
	private static HashMap<String, Integer> resultMap = new HashMap<String, Integer>();

	public static void main(String args[]) {
		List<Integer> input = new LinkedList<Integer>();
		input.add(1);
		input.add(2);
		input.add(2);
		input.add(3);
		input.add(4);

		int[] result = new int[input.size()];
		fullArray(input, 0, result);

		// 打印结果
		Set<String> results = resultMap.keySet();
		Iterator<String> it = results.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		} 
	}

	public static void fullArray(List<Integer> input, int layer, int[] result) {
		if (input.isEmpty()) { // 后面没排序的元素集合为空,输出一次result集合
			StringBuffer ss = new StringBuffer();
			for (int i = 0; i < 5; i++) {
				ss.append(result[i]);
			}
			if (!resultMap.containsKey(ss.toString())) {
				resultMap.put(ss.toString(), 1);
			}
			return;
		}

		for (int i = 0; i < input.size(); i++) {
			result[layer] = input.get(i);
			List<Integer> newRefer = new LinkedList<Integer>();
			for (int j = 0; j < input.size(); j++) {
				newRefer.add(input.get(j));
			}
			newRefer.remove(i); // 深拷贝一个新的input集合,把正在处理的元素,从当前的input集合中拿掉
			fullArray(newRefer, layer + 1, result);
		}
	}
}
9 楼 thihy 2012-09-02  
面试时,还是非递归实现更加好一点。
8 楼 巴巴米 2012-09-02  
Iam42 写道
巴巴米 写道
Iam42 写道
巴巴米 写道
晕死。。就这样吧。。不知道怎么回事
已经消除了重复,只有在找到没有重复的元素的时候才会调用递归,但是这个算法确实感觉不是最优的,你有什么改进的办法么

你自己运行一下吧。。反正我运行的时候是没有的

12234 // 12243 // 12324 // 12342 // 12423 // 12432 // 13224 // 13242 // 13422 // 14223 // 14232 // 14322 // 21234 // 21243 // 21324 // 21342 // 21423 // 21432 // 22134 // 22143 // 22314 // 22341 // 22413 // 22431 // 23124 // 23142 // 23214 // 23241 // 23412 // 23421 // 24123 // 24132 // 24213 // 24231 // 24312 // 24321 // 31224 // 31242 // 31422 // 32124 // 32142 // 32214 // 32241 // 32412 // 32421 // 34122 // 34212 // 34221 // 41223 // 41232 // 41322 // 42123 // 42132 // 42213 // 42231 // 42312 // 42321 // 43122 // 43212 // 43221 // 这是我运行之后的结果

哦,不好意思,我理解错了,我以为是把相同的数字的重复去掉呢。。
7 楼 Iam42 2012-09-02  
巴巴米 写道
Iam42 写道
巴巴米 写道
晕死。。就这样吧。。不知道怎么回事
已经消除了重复,只有在找到没有重复的元素的时候才会调用递归,但是这个算法确实感觉不是最优的,你有什么改进的办法么

你自己运行一下吧。。反正我运行的时候是没有的

12234 // 12243 // 12324 // 12342 // 12423 // 12432 // 13224 // 13242 // 13422 // 14223 // 14232 // 14322 // 21234 // 21243 // 21324 // 21342 // 21423 // 21432 // 22134 // 22143 // 22314 // 22341 // 22413 // 22431 // 23124 // 23142 // 23214 // 23241 // 23412 // 23421 // 24123 // 24132 // 24213 // 24231 // 24312 // 24321 // 31224 // 31242 // 31422 // 32124 // 32142 // 32214 // 32241 // 32412 // 32421 // 34122 // 34212 // 34221 // 41223 // 41232 // 41322 // 42123 // 42132 // 42213 // 42231 // 42312 // 42321 // 43122 // 43212 // 43221 // 这是我运行之后的结果
6 楼 巴巴米 2012-09-02  
Iam42 写道
巴巴米 写道
晕死。。就这样吧。。不知道怎么回事
已经消除了重复,只有在找到没有重复的元素的时候才会调用递归,但是这个算法确实感觉不是最优的,你有什么改进的办法么

你自己运行一下吧。。反正我运行的时候是没有的
5 楼 Iam42 2012-09-02  
巴巴米 写道
晕死。。就这样吧。。不知道怎么回事
已经消除了重复,只有在找到没有重复的元素的时候才会调用递归,但是这个算法确实感觉不是最优的,你有什么改进的办法么
4 楼 巴巴米 2012-09-02  
晕死。。就这样吧。。不知道怎么回事
3 楼 巴巴米 2012-09-02  
public class Plusplus {
	public static void main(String args[]) {
		List<Integer> result = new ArrayList<Integer>();
		List<Integer> input = new ArrayList<Integer>();
		input.add(1);
		input.add(2);
		input.add(2);
		input.add(3);
		input.add(4);
		Set<Integer> set = new HashSet<Integer>(input) ;
		input.clear();
		input.addAll(set) ;
		print(input,result) ;
	}
	public static void print(List<Integer> input,List<Integer> result) {
		for(int i = 0 ; i < input.size() ;i++) {
			List<Integer> tempresult = new ArrayList<Integer>() ;
			tempresult.addAll(result) ;
			List<Integer> temp = new ArrayList<Integer>() ;
			temp.addAll(input) ;
			if(temp.size()==1)  {
				tempresult.add(temp.get(0));
				System.out.println(tempresult);
				
			} else {
				tempresult.add(temp.get(i));
				temp.remove(i) ;
				print(temp,tempresult) ;
			}
			
		}
		
	}
}

额。。刚才用错标签了貌似
2 楼 巴巴米 2012-09-02  
你的消除重复应该没成功吧。。而且我觉得先消除重复在排序可能更快点
package test.integer;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Plusplus {
	public static void main(String args[]) {
		List<Integer> result = new ArrayList<Integer>();
		List<Integer> input = new ArrayList<Integer>();
		input.add(1);
		input.add(2);
		input.add(2);
		input.add(3);
		input.add(4);
		Set<Integer> set = new HashSet<Integer>(input) ;
		input.clear();
		input.addAll(set) ;
		print(input,result) ;
	}
	public static void print(List<Integer> input,List<Integer> result) {
		for(int i = 0 ; i < input.size() ;i++) {
			List<Integer> tempresult = new ArrayList<Integer>() ;
			tempresult.addAll(result) ;
			List<Integer> temp = new ArrayList<Integer>() ;
			temp.addAll(input) ;
			if(temp.size()==1)  {
				tempresult.add(temp.get(0));
				System.out.println(tempresult);
				
			} else {
				tempresult.add(temp.get(i));
				temp.remove(i) ;
				print(temp,tempresult) ;
			}
			
		}
		
	}
}


不过感觉这么做数据一大的话就会很慢
1 楼 wkshippou 2012-09-02  
niubility

相关推荐

    Java程序员面试笔试宝典-何昊pdf版

    根据提供的文件信息,我们可以推断出这...综上所述,《Java程序员面试笔试宝典》这本书旨在全方位地帮助Java开发者们提高自己的技术水平和面试成功率,无论是对于初学者还是有一定工作经验的专业人士都非常有参考价值。

    Java程序员面试笔试宝典-何昊 带目录

    Java程序员面试笔试宝典-何昊 高清扫描 带目录

    Java程序员面试宝典

    《Java程序员面试宝典》附带1张DVD光盘,内容为《Java程序员面试宝典》所有面试题的多媒体教学视频(共14.5小时)及免费赠送的55小时Java教学视频和5.5小时算法教学视频。授人以鱼,不如授人以渔。《Java程序员面试...

    Java程序员面试笔试宝典-何昊

    Java程序员面试笔试宝典是何昊撰写的一本针对Java开发者面试和笔试准备的重要参考资料。这本书深入浅出地探讨了Java语言的关键特性和应用场景,旨在帮助求职者提升技能,顺利通过面试。以下是对Java语言特点的详细...

    2018年java-程序员面试宝典+题库

    2018java程序员面试宝典+题库,很全。压缩的文档,打开是PDF版

    JAVA程序员面试宝典 第4版-欧立奇

    ### JAVA程序员面试宝典 第4版-欧立奇 #### 关键知识点概览 《JAVA程序员面试宝典 第4版》是一本专为JAVA程序员准备的面试指南书籍,由作者欧立奇撰写。本书旨在帮助JAVA程序员更好地应对面试挑战,通过深入浅出的...

    java程序员面试宝典.chm

    java程序员面试宝典.chm;讲了java面试的许多东西,要面试的同志可以看下了。

    java程序员面试笔试宝典-何昊

    Java程序员面试笔试宝典是为准备Java开发职位面试的求职者提供的一份全面参考资料,由何昊编写。这本书涵盖了Java编程语言的核心概念、高级特性、数据结构与算法、设计模式、多线程、网络编程、数据库操作等多方面的...

    Android高薪之路:Android程序员面试宝典-李宁(高清PDF完整版)_part2

    Java程序员面试宝典(第二版)-欧立奇(PDF扫描版) Java程序员面试宝典-杨磊(高清PDF扫描版)、 程序员面试宝典(第四版)-欧立奇(完整文字版)、 程序员面试金典(第5版)-英文版(高清PDF)、 程序员面试金典...

    程序员面试宝典--程序员面试必备!

    根据给定的信息,“程序员面试宝典--程序员面试必备!”这份资料是针对程序员面试的一个综合性指南。从标题和描述中可以推断出这份宝典包含了在面试过程中常见的问题、技巧以及应对策略等内容。虽然提供的具体内容...

    2023黑马面试宝典-Java面试宝典大全-java面试宝典黑马

    Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...

    Java程序员面试宝典-第4版.epub

    《Java程序员面试宝典》-第4版-中文版,epub电子书,下载EPUB File Reader软件即可查看,内容可拷贝

    Java程序猿上班那点事PDF和Java程序员面试笔试宝典-何昊PDF

    Java程序猿上班那点事PDF和Java程序员面试笔试宝典-何昊PDF两本质量挺高的PDF书籍

    Java程序员面试宝典.pdf

    ### Java程序员面试宝典知识点概览 #### 一、唯一性——聚焦Java程序员求职面试技巧 **《Java程序员面试宝典》**之所以独具特色,在于它是国内市场上唯一一本专门针对Java程序员求职面试技巧的图书。这本宝典不仅...

    Android高薪之路:Android程序员面试宝典-李宁(高清PDF完整版)_part1

    Java程序员面试宝典(第二版)-欧立奇(PDF扫描版) Java程序员面试宝典-杨磊(高清PDF扫描版)、 程序员面试宝典(第四版)-欧立奇(完整文字版)、 程序员面试金典(第5版)-英文版(高清PDF)、 程序员面试金典...

    java程序员面试宝典 2010版 最新版面试宝典

    《Java程序员面试宝典2010版》是针对Java开发者进行面试准备的重要参考资料,它汇集了众多IT公司的面试和笔试题目,旨在帮助求职者掌握关键的Java技术知识,提高面试成功率。以下是对该宝典中可能涵盖的主要知识点的...

    Java程序员面试宝典.rar

    《Java程序员面试宝典》是Java开发者在求职面试过程中的一份重要参考资料,它涵盖了Java编程的基础、进阶以及面试常见问题。这份压缩包文件包含了一本名为“2008820190118.chm”的帮助文档,很可能是详细整理的面试...

    JAVA程序员面试宝典

    JAVA程序员面试宝典 JAVA程序员面试宝典是一份涵盖了JAVA编程语言的各个方面的知识点的面试指南。这份指南涵盖了JAVA语言的基础知识、面向对象编程、字符串处理、异常处理、Servlet生命周期、集合框架、EJB技术等...

Global site tag (gtag.js) - Google Analytics