• 各种排列组合


    function getGroup(arr) {
        let r = [];
        function f(n){
            if(n==0){
                r.push([arr[0]]);
                return r;
            }
            f(n-1).forEach(v=>{
                v = v.slice();
                v.push(arr[n])
                r.push(v);
            });
            r.push([arr[n]]);
            return r;
        }
        return f(arr.length-1);
    }

    输入:[1,2,3]

    输出:[ [ 1 ], [ 1, 2 ], [ 2 ], [ 1, 3 ], [ 1, 2, 3 ], [ 2, 3 ], [ 3 ] ]

    function getGroupStr(str) {
        let r = [];
        function f(n){
            if(n==0){
                r.push(str[0]);
                return r;
            }
            f(n-1).forEach(v=>{
                r.push(v+str[n]);
            });
            r.push(str[n]);
            return r;
        }
        return f(str.length-1);
    }

    输入:“abc”

    输出:['a', 'ab', 'b', 'ac', 'abc', 'bc', 'c']

    // 返回分组的索引
    function groupSplitIdx (arrSize, n) {
      var r = [];
    
      function _(t, i) {
        if (t.length === n) {
          r[r.length] = t.slice();
          return;
        }
        for (; i < arrSize; i++) {
          t.push(i);
          _(t, i + 1);
          t.pop();
        }
      }
      _([], 0);
      return r;
    }

    输入:5,3

    输出:

    [
      [ 0, 1, 2 ], [ 0, 1, 3 ],
      [ 0, 1, 4 ], [ 0, 2, 3 ],
      [ 0, 2, 4 ], [ 0, 3, 4 ],
      [ 1, 2, 3 ], [ 1, 2, 4 ],
      [ 1, 3, 4 ], [ 2, 3, 4 ]
    ]
    function groupSplit (arr, size) {
      var r = [];
    
      let b = new Array(size);
      function _(start, end, x) {
        if (x == size) {
          r.push(b.slice());
          return;
        }
        if ((end - start) < (size - x)) {
          return;
        }
        b[x] = arr[start];
        _(start + 1, end, x + 1);
        _(start + 1, end, x);
      _(0, arr.length, 0);
      return r;
    }

    输入:[1,2,3,4,5], 3

    输出:

    [
      [ 1, 2, 3 ], [ 1, 2, 4 ],
      [ 1, 2, 5 ], [ 1, 3, 4 ],
      [ 1, 3, 5 ], [ 1, 4, 5 ],
      [ 2, 3, 4 ], [ 2, 3, 5 ],
      [ 2, 4, 5 ], [ 3, 4, 5 ]
    ]
    function groupSplitIdx2 (m) {
      let r = [];
      function _(i) {
        if (i == 0) {
          r.push([0]);
          return r;
        }
        _(i - 1).forEach(v=>{
          v = v.slice();
          v.push(i);
          r.push(v);
        });
        r.push([i]);
        return r;
      }
      return _(m-1);
    }
    

     输入:4

     输出:

    [
      [ 0 ],       [ 0, 1 ],
      [ 1 ],       [ 0, 2 ],
      [ 0, 1, 2 ], [ 1, 2 ],
      [ 2 ],       [ 0, 3 ],
      [ 0, 1, 3 ], [ 1, 3 ],
      [ 0, 2, 3 ], [ 0, 1, 2, 3 ],
      [ 1, 2, 3 ], [ 2, 3 ],
      [ 3 ]
    ]
    function groupSplitIdx3 (arrSize, n) {
      var r = [];
    
      function _(t, i) {
        if (t.length === n) {
          return;
        }
        for (; i < arrSize; i++) {
          t.push(i);
          r.push(t.slice());
          _(t, i + 1);
          t.pop();
        }
      }
      _([], 0);
      return r;
    }

    输入:5,3

    输出:

    [
      [ 0 ],       [ 0, 1 ],    [ 0, 1, 2 ],
      [ 0, 1, 3 ], [ 0, 1, 4 ], [ 0, 2 ],
      [ 0, 2, 3 ], [ 0, 2, 4 ], [ 0, 3 ],
      [ 0, 3, 4 ], [ 0, 4 ],    [ 1 ],
      [ 1, 2 ],    [ 1, 2, 3 ], [ 1, 2, 4 ],
      [ 1, 3 ],    [ 1, 3, 4 ], [ 1, 4 ],
      [ 2 ],       [ 2, 3 ],    [ 2, 3, 4 ],
      [ 2, 4 ],    [ 3 ],       [ 3, 4 ],
      [ 4 ]
    ]

     数组的排列组合

    function arrCom(arr) {
      function _(n) {
        if (n === 1) {
          return arr[0].map(a=>[a]);
        } else {
          let r = [];
          _(n - 1).forEach(item=>{
            arr[n - 1].forEach(a=>{
              let item2 = item.slice();
              item2.push(a);
              r.push(item2);
            });
          });
          return r;
        }
      }
      return _(arr.length);
    }

    输入:

    [
    [1, 2], [3, 4], [5, 6, 7, 9, 10]
    ]

    输出:

    [
    [ 1, 3, 5 ], [ 1, 3, 6 ],
    [ 1, 3, 7 ], [ 1, 3, 9 ],
    [ 1, 3, 10 ], [ 1, 4, 5 ],
    [ 1, 4, 6 ], [ 1, 4, 7 ],
    [ 1, 4, 9 ], [ 1, 4, 10 ],
    [ 2, 3, 5 ], [ 2, 3, 6 ],
    [ 2, 3, 7 ], [ 2, 3, 9 ],
    [ 2, 3, 10 ], [ 2, 4, 5 ],
    [ 2, 4, 6 ], [ 2, 4, 7 ],
    [ 2, 4, 9 ], [ 2, 4, 10 ]
    ]

     快速组合的方式:

    function arrCom(arr, cb) {
      let r = [];
      let lastIdx = arr.length - 1;
      function _(arr, n) {
        let a = arr[n];
        if (n === lastIdx) {
          if (a.length) {
            for (let i = 0, j = a.length; i < j; i++) {
              r.push(a[i]);
              cb(r);
              r.pop();
            }
          } else {
            cb(r);
          }
          return;
        }
    
        if (a.length) {
          for (let i = 0, j = a.length; i < j; i++) {
            r.push(a[i]);
            _(arr, n + 1);
            r.pop();
          }
        } else {
          _(arr, n + 1);
        }
      }
    
      _(arr, 0);
    }
  • 相关阅读:
    MySQL如何查询两个日期之间的记录
    Android常用权限
    Android如何区别真机和模拟器
    android资源文件说明
    Android文件存取路径
    @SuppressLint("NewApi")和@TargetApi()的区别
    Java注释规范
    启动IpFilterDriver驱动
    IDEA 创建 Spring Boot 多模块项目(Multi Modules)
    Spring Boot 多环境如何配置
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/13090691.html
Copyright © 2020-2023  润新知