• 排列


    有A,B,C, D四个数,求他们的全排列:

    首先选取第一位,有四种情况

    A     B C D

    B     A C D

    C     B A D

    D     B C A

    对于剩下的三个数字,用同样的方法,先确定第一个数字即可。以BCD为例,有

    B    C D

    C    B D

    D    B  C

    .....

     1.从N个数中取出N个进行全排列

    Java版代码:

    public class Permutations {
        public static void main(String[] args) {
            String s = "abcd";
            permutations(s);
        }
    
        // 全排列
        public static void permutations(String s) {
            char[] arr = s.toCharArray();
            int[] cnt = new int[1];
            _permutations(arr, 0, cnt);
            System.out.println("共有" + cnt[0] + "中排列");
        }
    
        // cnt 用来统计排列的个数
        private static void _permutations(char[] arr, int start, int[] cnt) {
            if (start == arr.length - 1) {
                cnt[0]++;
                System.out.println(arr);
           return; }
    char tmp; for (int i = start; i < arr.length; ++i) { tmp = arr[start]; arr[start] = arr[i]; arr[i] = tmp; _permutations(arr, start + 1, cnt); tmp = arr[start]; arr[start] = arr[i]; arr[i] = tmp; } } }

    效果:

    abcd
    abdc
    acbd
    acdb
    adcb
    adbc
    bacd
    badc
    bcad
    bcda
    bdca
    bdac
    cbad
    cbda
    cabd
    cadb
    cdab
    cdba
    dbca
    dbac
    dcba
    dcab
    dacb
    dabc
    共有24中排列

     2.从N个数中取出M个进行全排列

    public class Permutations {
        public static void main(String[] args) {
            String s = "abcd";
            permutations(s, 2);
        }
        
        public static void permutations(String s, int num) {
            char[] arr = s.toCharArray();
            int[] cnt = new int[1];
            // 异常处理
            if (num <= 0 || num > arr.length)
                num = arr.length;
            _permutations(arr, 0, num, num, cnt);
            System.out.println("共有" + cnt[0] + "中排列");
        }
        
        // num表示对M个数进行全排列,leftNum记录剩余要排列的个数
        private static void _permutations(char[] arr, int start, int num, int leftNum, int[] cnt) {
            if (leftNum == 0) {
                for (int i = 0; i < num; ++i) {
                    System.out.print(arr[i]);    
                }
                System.out.println();
                cnt[0]++;
           return; }
    char tmp; for (int i = start; i < arr.length; ++i) { tmp = arr[start]; arr[start] = arr[i]; arr[i] = tmp; _permutations(arr, start + 1, num, leftNum-1, cnt); tmp = arr[start]; arr[start] = arr[i]; arr[i] = tmp; } } }

    效果:

    ab
    ac
    ad
    ba
    bc
    bd
    cb
    ca
    cd
    db
    dc
    da
    共有12中排列
  • 相关阅读:
    Sql例子Sp_ExecuteSql 带参数
    Flex显示麦克风当前音量
    无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent
    FMS (端口问题)如何穿透防火墙
    19:A*B问题
    6264:走出迷宫
    2753:走迷宫
    1792:迷宫
    换钱问题(经典枚举样例)
    1943(2.1)
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6831127.html
Copyright © 2020-2023  润新知