1. 程式人生 > >Java實現從m個各不相同的元素中取出n個,並進行全排列。

Java實現從m個各不相同的元素中取出n個,並進行全排列。

  最近在看面試題的時候發現,一些基礎的演算法都記不住了,只是能大概說出個原理….為了加深記憶,這裡對一些簡單的演算法題進行一個歸納。

  下面的程式碼主要解決的問題是:從m個各不相同的元素中取出n個,進行全排列,得到所有可能的結果。
  即:輸入為字元陣列(陣列內每個字元均不相同)和個數n,返回由這些字元組成的所有長度為n的字串。

測試用例樣例:
  輸入為{‘a’,’b’,’c’}和個數1,返回值為{“a”,”b”,”c”}
  輸入為{‘a’,’b’,’c’,’d’}和個數2,返回值為{“ab”,”ac”,”ad”,”ba”,”bc”,”bd”,”ca”,”cb”,”cd”,”da”,”db”,”dc”}

下面是Java實現:

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Flynnon on 17-2-26.
 */
public class ListChars {
    /**
     * @param chars 總的字元序列(陣列)
     * @param n     要取出的字元的個數
     */
    public static void doit(char[] chars, int n) {
        if (n <= 0 || chars == null) {
            return
; } List<Character> charList = new ArrayList<>(); //通過這一步初始化序列的長度 for (int i = 0; i < n; i++) { charList.add('#'); } listAll(charList, chars, n); } /** * 從m個元素中任取n個並對結果進行全排列 * @param list 用於承載可能的排列情況的List * @param
chars 總的字元陣列,長度為m * @param n 從中取得字元個數 */
public static void listAll(List<Character> list, char[] chars, int n) { if (n == 0) { //這裡偷懶,直接列印了.... System.out.println(list); // 輸出一種可能的排列 return; } for (char aChar : chars) { // 暴力嘗試 if (!list.contains(aChar)) { // 若List中不包含這一位元素 list.set(list.size() - n, aChar); // 將當前元素加入 } else { // 否則跳到下一位 continue; } listAll(list, chars, n - 1); // 下一位 list.set(list.size() - n, '#'); // 還原 } } public static void main(String[] args) { // 以字元陣列承載總的字元集合 char[] chars = {'a', 'b', 'c', 'd'}; ListChars.doit(chars, 2); } }

  下面是測試用例及結果,與預期結果一致。
測試用例一

測試用例二

由於本人水平有限,本文難免存在謬誤,歡迎批評指正!