【问题标题】:I keep getting index out of range error what is wrong with my code?我不断收到索引超出范围错误我的代码有什么问题?
【发布时间】:2017-11-21 15:35:57
【问题描述】:

我的代码无法正常运行知道为什么我会出现超出索引范围的错误吗?

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

【问题讨论】:

  • 我邀请您添加一个 main 函数以实现更快的调试。无论如何,根据您的数组arg[lenArg-1]arg[lenArg-2] 可能会抛出超出范围的异常。

标签: arrays go slice


【解决方案1】:

我可以看到两种可能性。首先,在第一个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]arg[lenArg],这将超出范围。 (最后一个可用的索引是lenArg-1

【讨论】:

    【解决方案2】:

    The Go Programming Language Specification

    Index expressions

    表单的主要表达方式

    a[x]
    

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

    索引x 必须是整数类型或无类型;如果

    在范围内

    0 &lt;= x &lt; len(a)

    否则超出范围。


    您需要注意诸如长度012 之类的极端情况,因为索引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() {}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2020-10-11
      • 2013-05-18
      相关资源
      最近更新 更多