这似乎是超基本的,但是我在画空白。
我有几个for循环,我想检查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
条注释的地方出现错误:
未捕获的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
答案 0 :(得分:1)
您可以将以下行用作条件
!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;
}
答案 1 :(得分:0)
您可以尝试
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;
};
答案 2 :(得分:0)
最初的问题将是您尝试通过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 ¯\_(ツ)_/¯