问题描述:输入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);
}
}
}
以上是我的解题思路,希望多多指教。