【问题标题】:Count occurences of an object in a row before hitting a certain key in Javascript在 Javascript 中点击某个键之前计算对象在一行中的出现次数
【发布时间】:2021-12-26 05:15:15
【问题描述】:

我有一个数组,看起来像这样:

    var grid = [
        [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],
        [0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0]
    ];

我想计算连续 1 的数量,直到我们达到零为止。然后,如果我们再次命中 1,则再次计算连续出现的次数。

So for grid[0], it should return 9.
For grid[1], it should return [3,3].
grid[2], [2,1,1,2].

作为一个额外的乐趣,我也在尝试为“列”做这件事。 IE。 “1”出现在第 1 列的次数,包括 grid[0][1]、grid[1][1]、grid[2][1] 等。如果有更好的方法来组织数据来实现这一点,我愿意接受建议,因为我总共有 25 行/数组在数组中。

我不确定是否有不涉及反复循环数据的方法。目前我正在这样做:

    var guides = [];

    for ( var i = 0; i < grid.length; i++ ) {
      var row = grid[i];
      var chunks = [];
      var count = 0;
    
      for (var j = 0; j < row.length; j++ ) {
         if ( j === 1 ) {
             count++;
         } else {
           chunks.push(count);
           count = 0;
         }
      }

    guides.push(chunks);

    }
    

【问题讨论】:

标签: javascript arrays multidimensional-array


【解决方案1】:

这是一个示例,您可以如何使用递归来检查那些 1 号罢工。对于列,您可以转置原始 Grid 并重新使用相同的功能。

var grid = [
  [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
]

// Returns the array of 1 strikes in the given arr
const occurrenceOfOne = (arr, strike = 0, final = []) => {
  // Recursive calls until the array is empty
  if (arr.length === 0) {
    return strike === 0 ? final : final.concat([strike])
  }

  // If the item is 0, the strike ends.
  if (arr[0] === 0) {
    if (strike !== 0) {
      return occurrenceOfOne(arr.slice(1), 0, final.concat([strike]))
    }
  }

  // If the item is 1, the strike continues
  if (arr[0] === 1) {
    return occurrenceOfOne(arr.slice(1), strike + 1, final)
  }

  // Default value 0 found and strike is 0 as well.
  return occurrenceOfOne(arr.slice(1), 0, final)
}

// Copied transpose function from this gist:
// https://gist.github.com/femto113/1784503
function transpose(a) {
  return a[0].map((_, c) => a.map((r) => r[c]))
}

console.log(occurrenceOfOne(grid[0]))
console.log(occurrenceOfOne(grid[1]))
console.log(occurrenceOfOne(grid[2]))

const transposedGrid = transpose(grid)
console.log(occurrenceOfOne(transposedGrid[6]))
console.log(occurrenceOfOne(transposedGrid[7]))

【讨论】:

  • 啊,我没有考虑递归调用相同的函数。列总和也很新颖,但我试图在列视图上再次获得出现,而不是总数。我应该更清楚这一点。我将使用递归,然后看看我是否可以转置网格并将其应用到那里。
  • 我明白了,类似但只是角度不同。
  • 您可以通过转置原始网格轻松完成此操作。为此目的复制了一个衬里。然后就可以使用原来的功能了。解决方案已编辑。
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多