我一直在索引超出范围错误我的代码出了什么问题?

时间:2017-11-21 03:17:43

标签: arrays go slice

我的代码无法正常运行我试图让它找到峰值,包括数组的结束和开始,然后比较所有不是索引的开头或结尾的索引在它们之前和之后做任何人知道为什么我会超出索引范围错误吗?

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() {}

游乐场:https://play.golang.org/p/2JRgEyRA50

2 个答案:

答案 0 :(得分:3)

我可以看到两种可能性。首先,在第一个else if

}else if arg[lenArg - 1] > arg[lenArg -2] {

如果lenArg1,则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

     

Index expressions

     

表单的主要表达式

a[x]
     

表示由a索引的切片x的元素。

     

索引x必须是整数类型或无类型;它在范围内

     

0 <= x < len(a)

     

否则超出范围。

您需要注意索引0超出范围的长度12i - 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() {}

游乐场:https://play.golang.org/p/9klj1wYnXZ