把一個數組裏的數的組合所有列出

題目: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

在CODE上查看代碼片派生到個人代碼片

  1. package javainterview;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6.   
  7. public class Q7_1_1_a {  
  8.   
  9.     public static void listAll(List<Integer> candidate, String prefix){  
  10.         if(prefix.length()!=0){  
  11.             System.out.println(prefix);  
  12.         }  
  13.           
  14.           
  15.         for(int i=0; i<candidate.size(); i++){  
  16.               
  17.             List<Integer> temp = new LinkedList<Integer>(candidate);  
  18.             int item = (int)temp.remove(i);  
  19.             listAll(temp, prefix+item);  
  20.         }  
  21.     }  
  22.     public static void main(String[] args) {  
  23.           
  24.         Integer[] array = {1,2};  
  25.         List<Integer> list = Arrays.asList(array);  
  26.         listAll(list, "");  
  27.     }  
  28. }  

2,有重複元素的數的組合

 

思路,由於有重複元素,按照1的作法,會出現重複的狀況,這裏的處理方法是把結果保存在一個HashSet裏,每獲得一個結果,檢查HashSet裏是否已經存在,不存在才輸出。

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package javainterview;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.HashSet;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7.   
  8. public class Q7_1_1_b {  
  9.   
  10.     public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){  
  11.         if(prefix.length()!=0 && !hs.contains(prefix)){  
  12.             System.out.println(prefix);  
  13.             hs.add(prefix);  
  14.         }  
  15.           
  16.           
  17.         for(int i=0; i<candidate.size(); i++){  
  18.               
  19.             List<Integer> temp = new LinkedList<Integer>(candidate);  
  20.             int item = (int)temp.remove(i);  
  21.             listAll(temp, prefix+item, hs);  
  22.         }  
  23.     }  
  24.     public static void main(String[] args) {  
  25.           
  26.         Integer[] array = {1,1,2};  
  27.         List<Integer> list = Arrays.asList(array);  
  28.         HashSet<String> hs = new HashSet<String>();  
  29.         listAll(list, "", hs);  
  30.     }  
  31. }  

3,沒有重複元素的全排列

 

思路,不一樣之處在於只要全部元素的全排列,不要子集了。那麼,在輸出時加多一個判斷就能夠了,就是list的size要等於0.

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package javainterview;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6.   
  7. public class Q7_1_1_c {  
  8.       
  9.     public static void listAll(List<Integer> candidate, String prefix){  
  10.         if(candidate.size()==0 && prefix.length()!=0){  
  11.             System.out.println(prefix);  
  12.         }  
  13.           
  14.           
  15.         for(int i=0; i<candidate.size(); i++){  
  16.               
  17.             List<Integer> temp = new LinkedList<Integer>(candidate);  
  18.             int item = (int)temp.remove(i);  
  19.             listAll(temp, prefix+item);  
  20.         }  
  21.     }  
  22.     public static void main(String[] args) {  
  23.           
  24.         Integer[] array = {1,2};  
  25.         List<Integer> list = Arrays.asList(array);  
  26.         listAll(list, "");  
  27.     }  
  28.   
  29. }  

爲方便起見,無論是字符串全排列仍是數組全排列,所有轉化爲LinkedList來處理

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package javainterview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7.   
  8. public class Permutation {  
  9.       
  10.     public static List<String> permutation(String s){  
  11.         List<String> res = new ArrayList<String>();  
  12.         if(s==null) return res;  
  13.           
  14.         List<Character> list = new LinkedList<Character>();  
  15.         for(int i=0; i<s.length(); i++)  
  16.             list.add(s.charAt(i));  
  17.         permutation(res, list, "");  
  18.         return res;  
  19.           
  20.     }  
  21.     public static void permutation(List<String> res, List<Character> list, String prefix){  
  22.         if(list.size()==0)  
  23.             res.add(prefix);  
  24.         for(int i=0; i<list.size(); i++){  
  25.               
  26.             List<Character> temp = new LinkedList<Character>(list);  
  27.             char item = (char)temp.remove(i);  
  28.             permutation(res, temp, prefix+item);  
  29.         }  
  30.     }  
  31.   
  32.     public static void main(String[] args) {  
  33.         // TODO Auto-generated method stub  
  34.         String s = "";  
  35.         List<String> res = permutation(s);  
  36.         for(String item : res)  
  37.             System.out.println(item + ";");  
  38.     }  
  39. }  

 

 

4, 有重複元素的全排列

 

思路:也是用一個HashSet來存放結果。

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package javainterview;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.HashSet;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7.   
  8. public class Q7_1_1_d {  
  9.       
  10.     public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){  
  11.         if(candidate.size()==0 && prefix.length()!=0 && !hs.contains(prefix)){  
  12.             System.out.println(prefix);  
  13.             hs.add(prefix);  
  14.         }  
  15.           
  16.           
  17.         for(int i=0; i<candidate.size(); i++){  
  18.               
  19.             List<Integer> temp = new LinkedList<Integer>(candidate);  
  20.             int item = (int)temp.remove(i);  
  21.             listAll(temp, prefix+item, hs);  
  22.         }  
  23.     }  
  24.     public static void main(String[] args) {  
  25.           
  26.         Integer[] array = {1,1,2};  
  27.         List<Integer> list = Arrays.asList(array);  
  28.         HashSet<String> hs = new HashSet<String>();  
  29.         listAll(list, "", hs);  
  30.     }  
  31.   
  32. }  
相關文章
相關標籤/搜索