问题: 数字或字母的全排列,如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); } }