代码之家  ›  专栏  ›  技术社区  ›  Simon

比较数组元素previous和next

  •  0
  • Simon  · 技术社区  · 5 年前

    这看起来很基本,但我还是不知道。

    我有几个循环,我想检查一下 i j 价值观 -1 +1 但是很明显我正在检查的数组没有 arr[0-1] 元素返回错误。我该怎么解决?

    var islandPerimeter = function(grid) {
    let result = 0;
    
    for(var i = 0; i < grid.length; i++) {
      for(var j = 0; j < grid[i].length; j++) {
            if(grid[i][j] === 1) {
                if(grid[i-1][j] !== 1) { //left
                    result += 1;
                }
                if(grid[i+1][j] !== 1) { //right
                    result += 1;
                }
                if(grid[i][j+1] !== 1) { //bottom
                    result += 1;
                }
                if(grid[i][j-1] !== 1) { //top
                    result += 1;
                }
            }
          }  
       }
       return result;
    };
    

    所以我在哪里 //left 评论我得到一个错误:

    uncaught typeerror:无法读取未定义的属性“1”

    我怎样才能最好地防止这个问题?谢谢您。

    这是问题描述和 input 和预期的 output :

    您将得到一个二维整数网格形式的地图,其中1表示土地,0表示水。

    网格单元是水平/垂直连接的(不是对角线)。网格完全被水包围,只有一个岛(即一个或多个相连的陆地单元)。

    岛上没有“湖泊”(岛内的水与岛周围的水没有联系)。一个单元格是边长为1的正方形。网格是矩形的,宽度和高度不超过100。确定岛的周长。

    Input:
    [[0,1,0,0],
     [1,1,1,0],
     [0,1,0,0],
     [1,1,0,0]]
    
    Output: 16
    
    3 回复  |  直到 5 年前
        1
  •  1
  •   Maheer Ali    5 年前

    您可以使用以下行作为条件

    !grid[i-1] || grid[i-1][j] !== 1
    

    这将检查 grid[i-1] 不存在它会跳进 if 陈述。如果它存在,它将以正常的方式检查其他条件。

    for(var i = 0; i < grid.length; i++) {
      for(var j = 0; j < grid[i].length; j++) {
            if(grid[i][j] === 1) {
                if(!grid[i-1] || grid[i-1][j] !== 1) { //left
                    result += 1;
                }
                if(grid[i+1][j] !== 1) { //right
                    result += 1;
                }
                if(grid[i][j+1] !== 1) { //bottom
                    result += 1;
                }
                if(grid[i][j-1] !== 1) { //top
                    result += 1;
                }
            }
          }  
       }
       return result;
    }
    
        2
  •  0
  •   Yash Rami    5 年前

    你可以这样试试

    var islandPerimeter = function(grid) {
    let result = 0;
    
    for(var i = 0; i < grid.length; i++) {
      for(var j = 0; j < grid[i].length; j++) {
        if(grid[i][j] === 1) {
        if (i > 0) {    
        if(grid[i-1][j] !== 1) { //left
                result += 1;
            }
         }
            if(grid[i+1][j] !== 1) { //right
                result += 1;
            }
            if(grid[i][j+1] !== 1) { //bottom
                result += 1;
            }
            if(grid[i][j-1] !== 1) { //top
                result += 1;
            }
        }
      }  
     }
      return result;
     };
    
        3
  •  0
  •   HollyOS    5 年前

    最初的问题是在第一次尝试访问时 grid[i-1] . 当 i 等于 0 , grid[-1] 不存在。考虑到这一点,一些基本验证将确保只检查定义的单元格。

    然后您只需要使用括号符号来访问属性,使用所需的值。

    var islandPerimeter = function(grid) {
      let result = 0;
    
      for(var i = 0; i < grid.length; i++) {
        for(var j = 0; j < grid[i].length; j++) {
          if(grid[i][j] === 1) {
            if(grid[i-1] && grid[i-1][j] !== 1) { //left
              result += 1;
            }
    
            if(grid[i+1] && grid[i+1][j] !== 1) { //right
              result += 1;
            }
    
            if(grid[i][j+1] && grid[i][j+1] !== 1) { //bottom
              result += 1;
            }
    
            if(grid[i][j-1] && grid[i][j-1] !== 1) { //top
              result += 1;
            }
          }
        }
      }
      return result;
    };
    
    var grid = [
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    ];
    
    console.log(islandPerimeter(grid)); // returns 5 ¯\_(ツ)_/¯