Q7.1.1 把一個數組裏的數的組合全部列出

題目:

把一個數組裏的數的組合全部列出,比如1和2列來爲1,2,12,21.

分析:

這道題有多種擴展,

1,沒有重複元素的數的組合(包括子集的全排列);

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

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

4,有重複元素的數的全排列。


1,沒有重複元素的數的組合

思路:將數組元素存在LinkedList裏(方便刪除),遍歷List,刪除當前元素並把此元素加入結果,如果結果長度不爲0,則輸出,以此遞歸。

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裏是否已經存在,不存在才輸出。

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.

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來處理

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來存放結果。

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

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章