1 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
x鄰居的 和索引都y可能超出范圍,不僅是在 時(shí)-1,而且當(dāng)它們 >= 您用它們索引的切片的長(zhǎng)度時(shí)。
所以基本上有 4 個(gè)鄰居:
(y-1,x), (y+1, x), (y,x-1), (y,x+1)
你必須檢查所有越界的情況。您的恐慌發(fā)生在線(xiàn)路上k := ...,而不是在for循環(huán)內(nèi)。同樣在循環(huán)的早期返回將不會(huì)處理所有元素,這for從根本上就是錯(cuò)誤的。
所以基本上這是你可以做到的:
var result []int
if y > 0 {
result = append(result, matrix[y-1][x])
}
if y < len(matrix)-1 {
result = append(result, matrix[y+1][x])
}
if x > 0 {
result = append(result, matrix[y][x-1])
}
if x < len(matrix[y])-1 {
result = append(result, matrix[y][x+1])
}
return result
這將輸出(在Go Playground上嘗試):
[2 2]
注意,如果xory已經(jīng)無(wú)效,上面的代碼仍然會(huì) panic。如果你想防止它,你還必須驗(yàn)證xand y,例如:
var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
return result
}
另一種方法是在另一個(gè)切片中列出鄰居的deltaY和索引:deltaX
var neighbors = [][]int{
{-1, 0},
{1, 0},
{0, -1},
{0, 1},
}
您可以使用循環(huán)遍歷neighbors,然后您可以在一個(gè)地方檢查索引:
var result []int
for _, neighbor := range neighbors {
iy, ix := y+neighbor[0], x+neighbor[1]
if iy < 0 || iy >= len(matrix) || ix < 0 || ix >= len(matrix[iy]) {
continue
}
result = append(result, matrix[iy][ix])
}
return result
在Go Playground試試這個(gè)。
請(qǐng)注意,如果您在矩陣外部指定索引,并且該元素的鄰居落在矩陣內(nèi),則第二個(gè)解決方案也會(huì)返回鄰居。y=-1例如,使用, 作為輸入,將返回x=0鄰居 (y+1,x) 。0
- 1 回答
- 0 關(guān)注
- 71 瀏覽
添加回答
舉報(bào)