数字全排列问题

问题: 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;

实现代码:

import java.util.ArrayList;

/**
 * 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;
 * 
 */
public class Test4 {
	static ArrayList<String> list = new ArrayList<String>();

	public static void main(String[] args) {
		char buf[] = { '1', '2', '3', '4' };
		sort(buf, 0, buf.length - 1);
		System.out.println(list.toString());
	}

	public static void sort(char[] data, int start, int end) {
		// 递归的结束条件
		if (start == end) {
			list.add(new String(data));
		} else {
			for (int i = start; i <= end; i++) {
				//处理数组中相同的元素
				if (data[i] == data[start] && i != start) {
					continue;
				} else {
					// 交换数组第一个元素与后续的元素
					swap(data, i, start);

					// 后续元素递归全排列
					sort(data, start + 1, end); 

					// 将交换后的数组还原
					swap(data, i, start);
				}
			}
		}
	}

	// 交换数组中不同位置的值
	public static void swap(char[] data, int i, int j) {
		char temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}
}
实现思路如下:

首先能想到的便是递归的方式,但递归的思路有好多种,这只是其中一种。

这种思路是:分别计算第i个数据排在第一位的时候,其他n-1个数据的全排列,而n-1的全排列和n的全排列又是完全一样的,一直到只有一个数据时,也就是递归的结束条件。

如数字1234全排列,首先将1固定,对234进行全排列,而对234排列,将2固定,对34进行全排列,依次进行。

如果不考虑重复,还有一些不错的递归实现方式(以下均是转载):

转载自CSDN,作者 preferme (冰思雨) ,具体地址忘记了:

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

/**
 * 转载自CSDN,作者是 冰思雨
 * @author preferme
 *
 */
public class Test1 {

	public static void main(String[] args) {
		String s = "1245";
		List<String> result = new ArrayList<String>();
		list(s, "", result);
		System.out.println(result.size());
		System.out.println(result);
	}

	/**
	 * 列出基础字符串(base)的所有组合
	 * 
	 * @param base
	 *            以该字符串作为基础字符串,进行选择性组合。
	 * @param buff
	 *            所求字符串的临时结果
	 * @param result
	 *            存放所求结果
	 */
	public static void list(String base, String buff, List<String> result) {
		if (base.length() <= 0) {
			result.add(buff);
		}
		for (int i = 0; i < base.length(); i++) {
			list(new StringBuilder(base).deleteCharAt(i).toString(), buff
					+ base.charAt(i), result);
		}
	}
}

另一种方式累死(忘记转载自哪里了):

public static void main(String[] args) {
		String[] datas = new String[] { "1", "2", "3","4" };
		sort(Arrays.asList(datas), new ArrayList<String>());
	}
	
	private static void sort(List<String> datas, List<String> target) {
        if (target.size() == 4) { // 这个4表示要对几个字符进行全排列
            for (Object obj : target)
                System.out.print(obj);
            System.out.println();
            return;
        }
        for (int i = 0; i < datas.size(); i++) {
            List<String> newDatas = new ArrayList<String>(datas);
            List<String> newTarget = new ArrayList<String>(target);
            newTarget.add(newDatas.get(i));
            newDatas.remove(i);
            sort(newDatas, newTarget);
        }
    }


原文地址:https://www.cnblogs.com/xiaozhang2014/p/5297278.html