我的代码无法正常运行我试图让它找到峰值,包括数组的结束和开始,然后比较所有不是索引的开头或结尾的索引在它们之前和之后做任何人知道为什么我会超出索引范围错误吗?
package main
import "fmt"
func linearFindPeaks(arg []int) []int {
peaks := []int{}
lenArg := len(arg)
for i := 0; i < lenArg; i++ {
//if its the first element run this
//second if statement for the end of array
// for default statements
if arg[0] > arg[1] {
peaks = append(peaks, arg[0])
} else if arg[lenArg-1] > arg[lenArg-2] {
peaks = append(peaks, arg[lenArg-1])
} else if arg[i] > arg[i+1] && arg[i] > arg[i-1] && arg[i] != arg[0] && arg[i] != arg[lenArg-1] {
peaks = append(peaks, arg[i])
}
}
fmt.Println(peaks)
return peaks
}
func main() {}
答案 0 :(得分:3)
我可以看到两种可能性。首先,在第一个else if
:
}else if arg[lenArg - 1] > arg[lenArg -2] {
如果lenArg
为1
,则lenArg-2
将为-1
。这意味着arg[lenArg-2]
为arg[-1]
,这将使您超出范围。
其次,在第二个else if
:
} else if arg[i] > arg[i+1] ... {
在循环的最后一次迭代中,i
将为lenArg-1
,如果您向其添加1
,则会获得arg[lenArg-1+1]
或{{1}这将超出界限。 (最后一个可用索引位于arg[lenArg]
)
答案 1 :(得分:0)
The Go Programming Language Specification
表单的主要表达式
a[x]
表示由
a
索引的切片x
的元素。索引
x
必须是整数类型或无类型;它在范围内
0 <= x < len(a)
否则超出范围。
您需要注意索引0
超出范围的长度1
,2
和i - 1, i, i + 1
等极端情况。例如,
package main
// For array a, a[i] is a peak if it is not smaller than its neighbor(s),
// where a[-1] = a[n] = -∞.
func findPeaks(a []int) []int {
var p []int
// special cases
if len(a) == 0 {
return p
}
if len(a) == 1 {
return append(p, a[0])
}
// first
i := 0
if a[i] >= a[i+1] {
p = append(p, a[i])
}
// first < i < last
for i = 1; i < len(a)-1; i++ {
if a[i-1] <= a[i] && a[i] >= a[i+1] {
p = append(p, a[i])
}
}
// last
i = len(a) - 1
if a[i-1] <= a[i] {
p = append(p, a[i])
}
return p
}
func main() {}