1. 程式人生 > 實用技巧 >java如何進行排列組合運算

java如何進行排列組合運算

第一個問題:

  首先,先讓我們來看第一個問題, 有1,2,3,4這4個數字.可以重複的在裡面選4次,問能得到多少種結果.easy

  1  1  1  1

  1  1  1  2

  1  1  1  3  

  1  1  1  4

  1  1  2  1

  1  1  2  2

  .......

  4  4  4  3

  4  4  4  4

  程式碼實現其實也很簡單,大家可以看下程式碼,理解一下,再自己敲一下,應該可以很快敲出來

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importjava.util.Stack; publicclassMain { publicstaticStack<Integer> stack =newStack<Integer>(); publicstaticvoidmain(String[] args) { intshu[] = {1,2,3,4}; f(shu,4,0); } /** * * @param shu 待選擇的陣列 * @param targ 要選擇多少個次 * @param cur 當前選擇的是第幾次 */ privatestaticvoidf(int[] shu,inttarg,intcur) {
// TODO Auto-generated method stub if(cur == targ) { System.out.println(stack); return; } for(inti=0;i<shu.length;i++) { stack.add(shu[i]); f(shu, targ, cur+1); stack.pop(); } } }

  輸出:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [1, 1, 1, 1] [1, 1, 1, 2] [1, 1, 1, 3] [1, 1, 1, 4] [1, 1, 2, 1]
[1, 1, 2, 2] ............ ............ [4, 4, 3, 2] [4, 4, 3, 3] [4, 4, 3, 4] [4, 4, 4, 1] [4, 4, 4, 2] [4, 4, 4, 3] [4, 4, 4, 4]

  得到了想要的結果,此處結果又很多種4*4*4*4 = 256種結果。

第二個問題:

  同理, 問題來了,這時候有點排列組合的意思了 1,2,3,4排列要的到的是

1 2 3 4 5 6 7 1  2  3  4 1  2  4  3 1  3  4  2 1  3  2  4 ...... 4  2  1  2 4  3  2  1

 有沒有發現要的到排列的情況,這裡stack裡的元素是1,2,3,4都不能重複

那麼我在入棧的時候加個判斷,如果比如1,已經在stack裡面了,就不加進去,就不會得到 1  1  1  1 ...的情況了,就得到了排列

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 importjava.util.Stack; publicclassMain { publicstaticStack<Integer> stack =newStack<Integer>(); publicstaticvoidmain(String[] args) { intshu[] = {1,2,3,4}; f(shu,4,0); } /** * * @param shu 待選擇的陣列 * @param targ 要選擇多少個次 * @param cur 當前選擇的是第幾次 */ privatestaticvoidf(int[] shu,inttarg,intcur) { // TODO Auto-generated method stub if(cur == targ) { System.out.println(stack); return; } for(inti=0;i<shu.length;i++) { if(!stack.contains(shu[i])) { stack.add(shu[i]); f(shu, targ, cur+1); stack.pop(); } } } }

  輸出:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [1,2,3,4] [1,2,4,3] [1,3,2,4] [1,3,4,2] [1,4,2,3] [1,4,3,2] [2,1,3,4] [2,1,4,3] [2,3,1,4] [2,3,4,1] [2,4,1,3] [2,4,3,1] [3,1,2,4] [3,1,4,2] [3,2,1,4] [3,2,4,1] [3,4,1,2] [3,4,2,1] [4,1,2,3] [4,1,3,2] [4,2,1,3] [4,2,3,1] [4,3,1,2] [4,3,2,1]

  

這就是想要的排列結果了.. 4 * 3 * 2 * 1 = 24種結果。

第三個問題:

那麼組合問題來了,在1,2,3,4,中選3個有多少種組合方式

1 2 3 4 5 6 123 124 134 234 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 importjava.util.Stack; publicclassMain { publicstaticStack<Integer> stack =newStack<Integer>(); publicstaticvoidmain(String[] args) { intshu[] = {1,2,3,4}; f(shu,3,0,0);// 從這個陣列4個數中選擇三個 } /** * * @param shu 元素 * @param targ 要選多少個元素 * @param has 當前有多少個元素 * @param cur 當前選到的下標 * * 1 2 3 //開始下標到2 * 1 2 4 //然後從3開始 */ privatestaticvoidf(int[] shu,inttarg,inthas,intcur) { if(has == targ) { System.out.println(stack); return; } for(inti=cur;i<shu.length;i++) { if(!stack.contains(shu[i])) { stack.add(shu[i]); f(shu, targ, has+1, i); stack.pop(); } } } }

輸出:

1 2 3 4 [1,2,3] [1,2,4] [1,3,4] [2,3,4]