We read about foreign Daniel algorithm, dizzy 😷 front-end for Mao Kao so complex algorithm, colleagues said weibo interview is also the problem is, I think if really tested, the interview to write about problem solving thinking core code is ok, it is impossible to master mould the same are written out, even without missing an assignment of that kind of, overall train of thought for, thought for, train of thought to

function getCombBySum(array,sum,tolerance,targetCount){
  var util = {
    /*
      get combination from array
      arr: target array
      num: combination item length
      return: One array that contain combination */ /* one array that contain combination */ / I don't have to open my book. I'll give you a formula. P of n,m is equal to n factorial. /(n-m)! C(5,2)=5! / 2! * 3! = 5 * 4 * 3 * 2 * 1 / [(2 * 1) * (3 * 2 * 1)] = 10 this is the use of the loops and recursive made combinations * / getCombination:function(arr, num) {
      var r=[];
      (function f(t,a,n)
      {
          if (n==0)
          {
              return r.push(t);
          }
          for (var i=0,l=a.length; i<=l-n; i++)
          {
              f(t.concat(a[i]), a.slice(i+1), n-1);
          }
      })([],arr,num);
      return r;
    },
    # take array index to a array
    Get the index of the array
    getArrayIndex: function(array) {
      var i = 0,
        r = [];
      for(i = 0; i<array.length; i++){ r.push(i); }return r;
    }
  },logic = {
    # sort the array,then get what's we need
    Get the number in the array smaller than sum
    init: function(array,sum) {
      # clone array
      var _array = array.concat(),
      r = [],
      i = 0;
      # sort by asc
      _array.sort(function(a,b){
        return a - b;
      });
      # get all number when it's less than or equal sum
      for(i = 0; i<_array.length; i++){if(_array[i]<=sum){
          r.push(_array[i]);
        }else{
          break; }}return r;
    },
    # important function
    core: function(array,sum,arrayIndex,count,r){
      var i = 0,
        k = 0,
        combArray = [],
        _sum = 0,
        _cca = [],
        _cache = [];
      
      if(count == _returnMark){
        return;
      }
      # get current count combination
      # this sort is not the original array, but the indexed array
      combArray = util.getCombination(arrayIndex,count);
      for(i = 0; i<combArray.length; i++){ _cca = combArray[i]; _sum = 0; _cache = [];# calculate the sum from combination
        for(k = 0; k<_cca.length; k++){ _sum += array[_cca[k]]; _cache.push(array[_cca[k]]); }if(Math.abs(_sum-sum) <= _tolerance){
          r.push(_cache);
        }      
      }
      
      logic.core(array,sum,arrayIndex,count-1,r);
    }
    
  },
    r = [],
    _array = [],
    _targetCount = 0,
    _tolerance = 0,
    _returnMark = 0;
  
  # check data
  _targetCount = targetCount || _targetCount;
  _tolerance = tolerance || _tolerance;
  
  _array = logic.init(array,sum);
  if(_targetCount){
    _returnMark = _targetCount-1;
  }
  
  logic.core(_array,sum,util.getArrayIndex(_array),(_targetCount || _array.length),r);
  
  return r;
}
Copy the code