This example generates all the permutations of an array of numbers. The processing is done recurcively by generating all the permutations for the first number and combining it with the processing of the remaining numbers in the array. If the list contains only one elements there is nothing to do.
import java.util.ArrayList; public class InterviewPermutations { public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> a) { // Input validation if( a == null ) throw new IllegalArgumentException( "Input cannot be null" ); ArrayList<ArrayList<Integer>> toReturn = new ArrayList<ArrayList<Integer>>(); if( a.size() == 1 ){ toReturn.add( new ArrayList<Integer>(a) ); return toReturn; } // Loop on all the elements. for( int i = 0 ; i < a.size(); i++ ){ int current = a.get( i ); ArrayList<Integer> tmp = new ArrayList<Integer>(a); tmp.remove( i ); // Call recursively with subset ArrayList<ArrayList<Integer>> res = permute(tmp); // Create the result from the returned sub list 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 the results 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( "Starting array:" ); System.out.println( a ); ArrayList<ArrayList<Integer>> res = t.permute(a); System.out.println( "Result:" ); for(ArrayList<Integer> c : res ){ System.out.println( c ); } } }
Starting array: [1, 2, 3] Result: [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]
This example contains 3 elements, the number of permutations is 3! or 3 * 2 * 1 or 6.