java解决数字组合问题

问题描述输入1~9以内的几个数字,输出这些数字的多重组合。

输入1,2,3

输出

1

2

3

12

13

23

123

问题分析:

当输入为

1

输出

1

当输入为

1  2

输出

1

2

12

当输入为

1  2  3

输出

1

2

3

12

13

23

123

那么可以分析如下

当输入1 2 3 4时做了以下处理

把上面结果拷贝

1

2

3

12

13

23

123

1

2

3

12

13

23

123

然后在上面的基础上加上4即结果为

1

2

3

12

13

23

123

1

2

3

12

13

23

123

4

然后接着在拷贝的后面部分加上4,结果为

1

2

3

12

13

23

123

14

24

34

124

134

234

1234

4

然后讲以上数字排序输出,就得到了输入为[1 2 3 4] 时的结果。

在这个思路的基础上可以想到用递归的方法来做只需要在上一步的基础之上加上新的数字即可。实现代码如下:

import java.util.ArrayList;
import java.util.Collections;
public class Number {
	/*
	 * 递归函数的输入函数有两个,第一个表示输入数组中第几个数字,第二个表示输入数组
	 * 由于动态数组可以灵活添加元素,因此使用了动态数组来存储结果
	 */
	public static ArrayList<Integer> foo(int i,int[]vec){
		//递归结束的条件是读到第一个元素之后返回该元素
		if(i==0){
			ArrayList<Integer> list = new ArrayList<Integer>();
			list.add(vec[0]);
			return list;
		}
		else{
			//得到上一步的结果
			ArrayList<Integer> nlist = foo(i-1,vec);
			int n = nlist.size();
			int num = vec[i];
			//把输入数组中此处的元素添加进动态数组
			nlist.add(num);
			//动态数组中的每一个元素将输入数组中当前元素放在个位之后追加到动态数组
			for(int k=0;k<n;k++){
				nlist.add(nlist.get(k)*10+num);
			}
			return nlist;
		}
		
	}
	public static void main(String[] args) {
		int[] vec = {1,2,3};
		int l = vec.length;
		ArrayList<Integer> list = foo(l-1,vec);
		Collections.sort(list);
		for(int i:list){
			System.out.println(i);
		}
		
	}

}
以上是我的解题思路,希望多多指教。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值