【问题标题】:Array Processing logic correction阵列处理逻辑校正
【发布时间】:2017-09-18 02:47:02
【问题描述】:

我有一个数组[1,2,4,5,1,7,8,9,2,3]

我希望它生成所有值总和小于 10 的子集

当前结果[[1,2,4],[5,1],[7],[8],[9],[2,3]]

预期结果[[4,5,1],[9,1],[8,2],[3,7],[1,2]]

我就是这么做的

var a = [1,2,4,5,1,7,8,9,2,3], tempArr = []; tempSum = 0, result = [];
for (var i = 0;i< a.length; i += 1 ) {
  tempSum+=a[i];
  tempArr.push(a[i]);
  if((tempSum+a[i+1])>10) {
     result.push(tempArr);
     tempSum = 0;
     tempArr = [];
  } else if (i == a.length-1 && tempArr.length > 0) { // if array is [1,2,3]
    result.push(tempArr);
  }
}

但它给了我[[1,2,4],[5,1],[7],[8],[9],[2,3]],它有 6 个子集,但我希望得到 [[4,5,1],[9,1],[8,2],[3,7],[1,2]],它有 5 个子集。

【问题讨论】:

  • 您的问题是关于 “通过小于 10 的值的总和”,但您的意思是在预期结果中恰好是 10 或小于 10 的组。是另一条规则,例如,将单个数组中的项目计数保持在较低水平,例如 [7, 3] 而不是 [7, 2, 1]?
  • 你只有两个 1 开始,但使用三个 1 来产生结果。怎么样。?

标签: javascript arrays sorting arraylist multidimensional-array


【解决方案1】:

我已删除重复项,然后将 maxSum 参数添加到 combine function 以生成所有具有这些条件的子集,然后按值的总和对子集进行排序并对其进行切片。

您可以更改参数以适应您的问题。

var arr = [1,2,4,5,1,7,8,9,2,3]
MAX_SUM = 10,
MIN_SUBSET_LEN = 2,
RESULT_LEN = 5;

//remove duplicates
var uniqeSet = arr.filter(function(value, index){ 
  return this.indexOf(value) == index 
},arr);

// a function to get all subset which 
// their length are greater than minLength and 
// sum of values are little than maxSum
var combine = function(sourceArr, minLength, maxSum) {
    var fn = function(n, src, got, all, sum) {
        if(sum <= maxSum){
          if (n == 0) {
            if (got.length > 0) {
                all.push({arr:got,sum:sum});
            }
            return;
          }
          for (var j = 0; j < src.length; j++) {
            var tempSum = sum
            fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all, sum + src[j]);
          }
        }
        return;
    }
    
    var all = [];
    for (var i = minLength; i < sourceArr.length; i++) {
        fn(i, sourceArr, [], all, 0);
    }
    return all;
}


var result = combine(uniqeSet, MIN_SUBSET_LEN, MAX_SUM);

var sortedSliced = result.sort(function(a1, a2){
  return a2.sum - a1.sum;
}).slice(0, RESULT_LEN).map(function(m){return m.arr;});

console.log(JSON.stringify(sortedSliced));

【讨论】:

    【解决方案2】:

    以下逻辑在 JavaScript 中:-

    var limit = 10;
    var  arr = [1,2,4,5,1,7,8,9,2,3];
    arr.sort();
    var ans = new Array ( );
    while(arr.length >0){
        var ts = arr[arr.length-1];
        arr.splice(arr.length-1 , 1);   
        var ta= new Array ( );
        ta.push(ts);
        var x = arr.length-1;
        while(x>=0){    
            if(ts + arr[x] <= limit){       
                ts = ts + arr[x];           
                ta.push(arr[x]);        
                arr.splice(x , 1);
            }
            x= x-1;
        }
            ans.push(JSON.stringify(ta));   
    }
    alert(ans);
    

    它正在根据需要提供输出。

    [9,1],[8,2],[7,3],[5,4,1],[2]

    【讨论】:

    • 我添加了一个 const a = a[i+1] ? a[i+1] : 0;
    • 请告诉我们您使用的是哪种语言。
    • 我正在使用 javascipt
    • 问的问题有两个错误。请纠正它 1. 生成所有值的总和小于 10 但输出包含 [(9,1), (8,2), (7 ,3), (4,5,1)] 2.输入中有2次“1”,但输出中有3次“1”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2014-02-23
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多