2017-11-21 2 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

두 가지 가능성. 먼저, 첫 번째 else if에 :

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

lenArg하다면 1 다음 lenArg-2-1 될 것입니다. 즉, arg[lenArg-2]arg[-1]이며 범위를 벗어납니다. 두 번째 else if에서 두 번째로

: 당신이 얻을 것이다이 당신에게 1를 추가하면 루프를 통해 마지막 반복에

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

ilenArg-1 될 것 arg[lenArg-1+1] 또는 arg[lenArg]있는 범위를 벗어 것이다. 형태

a[x] 

0

The Go Programming Language Specification

Index expressions

일차 식 (가능한 마지막 인덱스 lenArg-1에있다) x 의해 인덱싱 슬라이스 a의 요소를 나타낸다.

색인 x은 정수 유형 또는 유형이 없어야합니다.

0 <= x < len(a)

그렇지가 범위를 벗어나면 그것은 범위이다.


당신은 길이 0, 1 같은 코너의 경우에주의해야하고, 인덱스 범위를 벗어난 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

관련 문제