この例では、数値の配列のすべての順列を生成します。 処理は、最初の数のすべての順列を生成し、それを配列の残りの数の処理と組み合わせることによって、再帰的に実行されます。 リストに1つの要素だけが含まれている場合は、何もしません。
import java.util.ArrayList; public class InterviewPermutations { public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> a) { // 入力検証 if( a == null ) throw new IllegalArgumentException( "入力はnullにできません" ); ArrayList<ArrayList<Integer>> toReturn = new ArrayList<ArrayList<Integer>>(); if( a.size() == 1 ){ toReturn.add( new ArrayList<Integer>(a) ); return toReturn; } // すべての要素をループします。 for( int i = 0 ; i < a.size(); i++ ){ int current = a.get( i ); ArrayList<Integer> tmp = new ArrayList<Integer>(a); tmp.remove( i ); // サブセットを使用して再帰的に呼び出します ArrayList<ArrayList<Integer>> res = permute(tmp); // 返されたサブリストから結果を作成する for( int j = 0 ; j < res.size() ; j++ ){ ArrayList<Integer> toAdd = new ArrayList<Integer>(); toAdd.add( current ); toAdd.addAll( res.get( j ) ); toReturn.add( toAdd ); } } // 結果を返す return toReturn; } public static void main(String[] argv) throws Exception { InterviewPermutations t = new InterviewPermutations(); ArrayList<Integer> a = new ArrayList<Integer>(); a.add( 1 ); a.add( 2 ); a.add( 3 ); System.out.println( "開始配列:" ); System.out.println( a ); ArrayList<ArrayList<Integer>> res = t.permute(a); System.out.println( "結果:" ); for(ArrayList<Integer> c : res ){ System.out.println( c ); } } }
開始配列: [1, 2, 3] 結果: [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]
この例は3つの要素を含んでおり、順列の数は3です! または3 * 2 * 1または6。