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);
			}
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值