更高效地对不同方块进行编码信号

问题描述 投票:0回答:3

我正在努力使我的代码更加高效。请诚实地告诉我如何修复它以及它是否是“意大利面条代码”。

CodeSignal 不同的方块

给定一个仅包含数字的矩形矩阵,计算其中不同的 2 × 2 正方形的数量。
例子: 对于矩阵 =
[[1, 2, 1],
[2,2,2],
[2,2,2],
[1,2,3],
[2,2,1]]
输出应该是 differentSquares(矩阵) = 6.
这里有 6 个不同的 2 × 2 正方形:
1 2
2 2
2 1
2 2
2 2
2 2
2 2
1 2
2 2
2 3
2 3
2 1

我当前的代码:

function differentSquares(matrix) {
  let smallSquares = [];

  for(let i = 0; i < matrix.length - 1; i++){
    buildCurr(matrix, i, smallSquares);
  }
  return smallSquares.length;
}
function compareArrs(smallSquares, currentSquare){
  let includes = smallSquares.find((arr) => arr.join("") === currentSquare.join(""));
  if(!includes){
    smallSquares.push(currentSquare);
  }            
}
function buildCurr(matrix, i, smallSquares){
  for(let j = 0; j < matrix[i].length - 1; j++){
    let currentSquare = [matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]];
    compareArrs(smallSquares, currentSquare);
  }
}

我遇到的错误:

测试通过:9/13。测试 10 超出执行时间限制:程序超出执行时间限制。确保它在几秒钟内完成任何可能的输入的执行。 单击“运行测试”按钮可查看示例或自定义测试用例的输出、控制台日志和详细错误消息。单击“提交”按钮时会隐藏此信息,以防止对隐藏测试用例的硬编码解决方案。
测试示例: 7/7
隐藏测试: 2/6
得分: 167/300

我意识到这可能与 O 表示法有关。当我将它分成另一个函数时,它变得更好,这就是我这样做的原因。

javascript arrays loops matrix big-o
3个回答
0
投票

我用这种方式解决了这个问题,我使用一个数组将所有小方块存储为字符串,并使用“include”操作来查找该数组中已有的值。

function differentSquares(matrix) {
  let smallSquares = [];
  var value = "";

  for(let i = 0; i < matrix.length - 1; i++){
      
    for(let j = 0; j < matrix[i].length - 1; j++){
        value = (`${matrix[i][j]}${matrix[i][j+1]}${matrix[i+1][j]}${matrix[i+1][j+1]}`)
        if(!smallSquares.includes(value)){
            smallSquares.push(value);
        }
    }
  }
  
  return smallSquares.length;
}

我希望它也能帮助任何寻找答案的人


0
投票

尝试使用集合而不是数组

function differentSquares(matrix) {
    s = new Set()
    for (i = 0; i < matrix.length-1; i++) {
        for (j = 0; j < matrix[i].length-1; j++) {
            s.add([matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]].toString())}}
    return s.size
}

0
投票

我这样做了 - 类似于上面 - 使用 C#

int solution(int[][] matrix) {
    var s = new HashSet<string>();
    for(int i = 0; i < matrix.Length - 1; i ++)
    {
        for(int j = 0; j < matrix[i].Length - 1; j++)
        {
           var str = $"{matrix[i][j]}, {matrix[i][j+1]}, {matrix[i+1][j]}, {matrix[i+1][j+1]}";
            s.Add(str);
        }
    }
        
     return s.Count();
}

不需要预先存储任何内容 - 使用哈希集 - 我们不会添加已经找到的内容

© www.soinside.com 2019 - 2024. All rights reserved.