某一次面试时的上机题,准备较充分的情况下完成的代码。很久没写算法类的代码了,放上来仅做保留方便查看。
package permutation;
import java.util.Iterator;
import java.util.TreeSet;
/**
* Permutation.class
* @author vincent
* 2007-07-28
*/
public class Permutation {
private static int count = 0; //计数器
private static TreeSet<String> set = new TreeSet<String>(); //保存符合要求的序列且不含重复元素
/**
* 将arr字符数组src和dest位置的字符进行交换
* @param arr
* @param src
* @param dest
*/
public static void swap(char[] arr , int src , int dest){
char temp = arr[src];
arr[src] = arr[dest];
arr[dest] = temp;
}
/**
* 判断arr序列是否符合要求
* 条件1:4不能在第三位
* 条件2:3与5不能相连
* @param arr
* @return
*/
public static boolean validate(char[] arr){
String temp = String.valueOf(arr);
return temp.charAt(2)!='4' && temp.indexOf("35")==-1 && temp.indexOf("53")==-1;
}
/**
* 对字符进行全排列(递增)
* 实现思路:345 -> 354 -> 435 -> 453 -> 534 - > 543
* 可以看出先将后面的45排列好后有2种:45和54,
* 把3加进来进行排列其实就是在这两种组合中循环的交换便能实现递增的全排列
* @param arr
* @param begin
* @param end
*/
public static void perm(char[] arr , int begin , int end){
if(begin == end){
if(validate(arr)){
set.add(String.valueOf(arr));
}
return ;
}
for (int i = begin; i <= end; i++) {
swap(arr , begin , i);
perm(arr , begin+1 , end);
swap(arr , begin , i);
}
}
/**
* 打印所有排列
* 每行10个
*/
public static void showAllPermutation(){
Iterator<String> it = set.iterator();
while(it.hasNext()){
count ++;
System.out.print(it.next()+" ");
if(count % 10 == 0){
System.out.println();
}
}
System.out.println("\n总共有 "+count+" 种");
}
/**
* 主函数
*/
public static void main(String[] args) {
char[] arr = {'1','2','2','3','4','5'};
// char[] arr = {'1','2','3'};
Permutation.perm(arr, 0, arr.length-1);
Permutation.showAllPermutation();
}
}