2017-11-21 40 views
0

私のコードは正しく実行されません。私は、配列の終わりと先頭を含むピークを見つけて、誰かが知っている前と後のインデックスの先頭または終わりではないすべてのインデックスを比較しようとしていますなぜインデックスの範囲外のエラーが出ているのですか?私のコードで何が問題になっていますか?

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

+1

は私が速くデバッグを許可する主な機能を追加することを勧めます。 とにかく、あなたの配列に依存して 'arg [lenArg-1]'と 'arg [lenArg-2]'は範囲外の例外を投げるかもしれません。 – Dlacreme

答えて

3

2つの可能性。まず、第1 else ifに:lenArg1ある場合

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

そしてlenArg-2-1になります。これは、arg[lenArg-2]arg[-1]であることを意味し、境界を超えてしまいます。二else ifにおける第二

、:

} else if arg[i] > arg[i+1] ... { 

ループの上に最後の繰り返しで、iは、あなたがこれに1を追加する場合は、arg[lenArg-1+1]または範囲外の意志arg[lenArg]を得るでしょう、lenArg-1になります。

0

The Go Programming Language Specification

Index expressions

(最後の利用可能なインデックスはlenArg-1である)の形の一次式は

a[x] 

xによってインデックス付けスライスaの要素を表します。

インデックスxは、整数型または型なしでなければなりません。

0 <= x < len(a)

それ以外の場合は、範囲外の場合には、範囲内にあります。


あなたは長さ01、およびインデックス範囲外i - 1, i, i + 1ため2のようなコーナーケースに注意を払う必要があります。例えば、

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

関連する問題