连击:在一个环境中,而不是另一种环境中的无效阵列长度



我对javascript是相对较新的,所以我真的很感激有人告诉我发生了什么/为什么

我正在处理编码员在Coderfight上的挑战。我的代码在JS小提琴中有效,但在CodeFights上失败了一个错误:

"RangeError: Invalid array length
at matrixElementsSum (file.js on line 25:17)
at _runyckrx (file.js on line ?:28)
at getUserOutputs (file.js on line ?:30)
at Object.<anonymous> (file.js on line ?:1)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:148:18)"

问题 - 如果数组被堆叠,并且在每个数组的特定索引处找到零,则每个数组将具有相同的索引值,也为零

示例:

[[0, 1, 1, 2], 
 [0, 5, 0, 0], 
 [2, 0, 3, 3]]

将是:

[[x, 1, 1, 2], 
 [x, 5, x, x], 
 [x, x, x, x]]

然后找到最终数组中每个值的总和

 matrix =    [[0,1,1,2], 
              [0,5,0,0], 
              [2,0,3,3]]
function matrixElementsSum(matrix) {
      // Calculate the width and height of the Array
      var w = matrix.length || 0;
      var h = matrix[0] instanceof Array ? matrix[0].length : 0;
      // In case it is a zero matrix return empty array.
      if(h === 0 || w === 0) { return []; }
      var i, j, t = [];
      // Loop through every item in the outer array (height)
      for(i=0; i<h; i++) {
        // Insert a new row (array)
        t[i] = [];
        // Loop through every item per item in outer array (width)
        for(j=0; j<w; j++) {
          // Save transposed martix.
          t[i][j] = matrix[j][i];
        }
      }
     // rows are now cols - if we come across a 0 the remaining values 
    //dont need to be there
      for(var i = 0; i < t.length; i++){
        t[i].length = t[i].indexOf(0);
      }
     //concat multi array to single array
    var merged = [].concat.apply([], t);
    // get sum of flattened array
    var totalCost = merged.reduce(function(acc, val) {
      return acc + val;
    }, 0);  
    return totalCost
    }
matrixElementsSum(matrix)

问题很可能在这里:

  for(var i = 0; i < t.length; i++){
    t[i].length = t[i].indexOf(0);
  }

如果t[i]不包含0,则indexOf()将返回-1。数组长度必须至少为0,您不能将其设置为-1。添加此检查:

for (var i = 0; i < t.length; i++) {
    var index = t[i].indexOf(0);
    if (index != -1) {
        t[i].length = index;
    }
}

您没有在JSFIDDLE中看到问题,因为您的matrix在每一列中都有0(t数组只是matrix的换位(。当您将程序提交给CoderFight时,他们可能会使用不同的矩阵进行测试,其中包括某些列中没有零的矩阵。然后遇到该错误。它与环境无关,只有输入数据。

相关内容

最新更新