題目:java
把一個數組裏的數的組合所有列出,好比1和2列來爲1,2,12,21.數組
分析:app
這道題有多種擴展,spa
1,沒有重複元素的數的組合(包括子集的全排列);.net
2,有重複元素的數的組合;code
3,沒有重複元素的數的全排列;blog
4,有重複元素的數的全排列。遞歸
1,沒有重複元素的數的組合ip
思路:將數組元素存在LinkedList裏(方便刪除),遍歷List,刪除當前元素並把此元素加入結果,若是結果長度不爲0,則輸出,以此遞歸。rem
[java] view plain copy


- package javainterview;
-
- import java.util.Arrays;
- import java.util.LinkedList;
- import java.util.List;
-
- public class Q7_1_1_a {
-
- public static void listAll(List<Integer> candidate, String prefix){
- if(prefix.length()!=0){
- System.out.println(prefix);
- }
-
-
- for(int i=0; i<candidate.size(); i++){
-
- List<Integer> temp = new LinkedList<Integer>(candidate);
- int item = (int)temp.remove(i);
- listAll(temp, prefix+item);
- }
- }
- public static void main(String[] args) {
-
- Integer[] array = {1,2};
- List<Integer> list = Arrays.asList(array);
- listAll(list, "");
- }
- }
2,有重複元素的數的組合
思路,由於有重複元素,按照1的作法,會出現重複的狀況,這裏的處理方法是把結果保存在一個HashSet裏,每獲得一個結果,檢查HashSet裏是否已經存在,不存在才輸出。
[java] view plain copy


- package javainterview;
-
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.LinkedList;
- import java.util.List;
-
- public class Q7_1_1_b {
-
- public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){
- if(prefix.length()!=0 && !hs.contains(prefix)){
- System.out.println(prefix);
- hs.add(prefix);
- }
-
-
- for(int i=0; i<candidate.size(); i++){
-
- List<Integer> temp = new LinkedList<Integer>(candidate);
- int item = (int)temp.remove(i);
- listAll(temp, prefix+item, hs);
- }
- }
- public static void main(String[] args) {
-
- Integer[] array = {1,1,2};
- List<Integer> list = Arrays.asList(array);
- HashSet<String> hs = new HashSet<String>();
- listAll(list, "", hs);
- }
- }
3,沒有重複元素的全排列
思路,不一樣之處在於只要全部元素的全排列,不要子集了。那麼,在輸出時加多一個判斷就能夠了,就是list的size要等於0.
[java] view plain copy


- package javainterview;
-
- import java.util.Arrays;
- import java.util.LinkedList;
- import java.util.List;
-
- public class Q7_1_1_c {
-
- public static void listAll(List<Integer> candidate, String prefix){
- if(candidate.size()==0 && prefix.length()!=0){
- System.out.println(prefix);
- }
-
-
- for(int i=0; i<candidate.size(); i++){
-
- List<Integer> temp = new LinkedList<Integer>(candidate);
- int item = (int)temp.remove(i);
- listAll(temp, prefix+item);
- }
- }
- public static void main(String[] args) {
-
- Integer[] array = {1,2};
- List<Integer> list = Arrays.asList(array);
- listAll(list, "");
- }
-
- }
爲方便起見,無論是字符串全排列仍是數組全排列,所有轉化爲LinkedList來處理
[java] view plain copy


- package javainterview;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.LinkedList;
- import java.util.List;
-
- public class Permutation {
-
- public static List<String> permutation(String s){
- List<String> res = new ArrayList<String>();
- if(s==null) return res;
-
- List<Character> list = new LinkedList<Character>();
- for(int i=0; i<s.length(); i++)
- list.add(s.charAt(i));
- permutation(res, list, "");
- return res;
-
- }
- public static void permutation(List<String> res, List<Character> list, String prefix){
- if(list.size()==0)
- res.add(prefix);
- for(int i=0; i<list.size(); i++){
-
- List<Character> temp = new LinkedList<Character>(list);
- char item = (char)temp.remove(i);
- permutation(res, temp, prefix+item);
- }
- }
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String s = "";
- List<String> res = permutation(s);
- for(String item : res)
- System.out.println(item + ";");
- }
- }
4, 有重複元素的全排列
思路:也是用一個HashSet來存放結果。
[java] view plain copy


- package javainterview;
-
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.LinkedList;
- import java.util.List;
-
- public class Q7_1_1_d {
-
- public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){
- if(candidate.size()==0 && prefix.length()!=0 && !hs.contains(prefix)){
- System.out.println(prefix);
- hs.add(prefix);
- }
-
-
- for(int i=0; i<candidate.size(); i++){
-
- List<Integer> temp = new LinkedList<Integer>(candidate);
- int item = (int)temp.remove(i);
- listAll(temp, prefix+item, hs);
- }
- }
- public static void main(String[] args) {
-
- Integer[] array = {1,1,2};
- List<Integer> list = Arrays.asList(array);
- HashSet<String> hs = new HashSet<String>();
- listAll(list, "", hs);
- }
-
- }