任務是撰寫一個函式,回傳一個元素的所有鄰居。對角線元素不被視為鄰居。
一般來說,問題解決了,但是如果元素落在矩陣之外,編譯器會生成運行時錯誤:index out of range [-1] 。現在我正在考慮制定一個排除矩陣外資料的條件。你能告訴我這種情況會是什么樣子嗎?我已經嘗試過類似的方法:如果元素 = -1,則從回應中洗掉元素。但它不起作用。
package main
import "fmt"
func Input(y, x int) []int {
matrix := [][]int{
[]int{0, 2, 3},
[]int{2, 3, 1},
[]int{8, 7, 4},
[]int{3, 2, 1},
}
k := []int{matrix[y 1][x], matrix[y-1][x], matrix[y][x 1], matrix[y][x-1]}
for _, z := range k {
if z == -1 { //error
return append(k[z:], k[:z-1]...)
}
}
return k
}
func main() {
fmt.Println(Input(0, 0))
}
uj5u.com熱心網友回復:
x鄰居的和索引都y可能超出范圍,不僅是在 be 時-1,而且當它們 >= 您用它們索引的切片的長度時也是如此。
所以基本上有4個鄰居:
(y-1,x), (y 1, x), (y,x-1), (y,x 1)
您必須檢查所有超出范圍的情況。您的恐慌發生k := ...在線上,而不是for回圈內。同樣在回圈的早期回傳也不會處理所有元素,這for從根本上來說是錯誤的。
所以基本上這就是你可以做到的:
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已經無效,上面的代碼仍然會 panic。如果你想防止它,你還必須驗證xand y,例如:
var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
return result
}
另一種方法是在另一個切片中列出鄰居的deltaY和deltaX索引:
var neighbors = [][]int{
{-1, 0},
{1, 0},
{0, -1},
{0, 1},
}
您可以使用回圈來遍歷neighbors,然后您可以在一個地方檢查索引:
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上試試這個。
請注意,如果該元素的鄰居落在矩陣內,則如果您在矩陣之外指定索引,則第二個解決方案也會回傳鄰居。例如,使用y=-1,x=0作為輸入,將0回傳鄰居 (y 1,x)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473030.html
