一般来说全排列用于数字排序问题,比如求1,2,3,5,6,7这几个数字组成的比123567大的第一个数,也就是123576,这时候可以用全排列来做,所有的可能都排一下,然后找大于123567的最小数,就是我们要求的了。时间复杂度就是O(n!)。当然这个题有别的做法,时间复杂度是O(n);有需要的可以找我,过两天再写。逻辑上也不复杂。
再比如阿里巴巴最近的一道题:输入6个0-9的数字,找出来能组合的最大时间,最小时间,如果不存在就输出N/A。比如123456,最大时间就是:23:56:41,最小时间就是12:34:56。首先全排列一下,然后先判断每个是否符合时间格式要求。然后设置最大的为00:00:00,最小的为:23:59:59,接下来去比较就好了,也没必要换算成秒去比,直接用字符串比较就Ok了。
我们可以看到全排列在这时候方法简单粗暴,但是比如另一种:1,2,2,3,4,如果排列有多少种不同的序列,这里考虑到有两个2,所以首先就是要排序,接下来就是中间细节处理了,有空我码代码试试。
全排列代码如下:
- public class permutate {
- public static int total = 0;
- public static void swap(String[] str, int i, int j)
- {
- String temp = new String();
- temp = str[i];
- str[i] = str[j];
- str[j] = temp;
- }
- public static void arrange (String[] str, int st, int len)
- {
- if (st == len - 1)
- {
- for (int i = 0; i < len; i ++)
- {
- System.out.print(str[i]+ " ");
- }
- System.out.println();
- total++;
- }
- else
- {
- for (int i = st; i < len; i ++)
- {
- swap(str, st, i);
- arrange(str, st + 1, len);
- swap(str, st, i);
- }
- }
- }
- public static void main(String[] args) {
- String str[] = {"a","b","c"};
- arrange(str, 0, str.length);
- System.out.println(total);
- }
- }