hackerrank圆阵列旋转运行时错误

时间:2018-02-02 14:42:50

标签: go runtime-error

我确实解决了一个hackerrank问题,即#34;圆阵列旋转"使用Go 当我运行代码它给我一个正确的响应,当我尝试提交代码所有测试通过除了一个,它说运行时错误

我尝试了失败的测试localy并且它通过了 我的代码是

    package main
    import "fmt"

    func CircularArrayRotation() {
        var n, k, q int

        fmt.Scanf("%d%d%d", &n, &k, &q)
        a := make([]int, n)
        for i := range a {
            fmt.Scanf("%d", &a[i])
        }

        var i int
        for t:=0; t<q; t++  {

            fmt.Scanf("%d", &i)
            j := (i - k)
            if j<0 {
                j+=n
            }

            fmt.Println(a[j])
        }

    }

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    CircularArrayRotation()
}

2 个答案:

答案 0 :(得分:3)

对于那些想要了解更多信息的人,您可以在此处查看:https://www.hackerrank.com/challenges/circular-array-rotation/problem

他失败案例的输入为this,预期输出为this

您的运行时错误是这样的:

  

恐慌:运行时错误:索引超出范围

     

goroutine 1 [running]:main.CircularArrayRotation()solution.go:22
  + 0x349 main.main()solution.go:29 + 0x20

因此,您的问题位于第22行,您的索引超出范围:fmt.Println(a[j])

这是因为您的代码当前无法处理多个轮换,因此在您的代码中最终会执行以下操作:

fmt.Println(a[-99477])

i8k100000

时会发生这种情况

想象一下你有这个输入:

  

n = 3
  k = 10
  q = 1
  i = 2

当您执行i - k我们得到-8时,我们会尝试添加n,这会给我们-5( - 8 + 3),然后我们尝试访问索引不存在。 a[-5]

如果您想解决此问题,可以执行以下操作(如果您想自己解决此问题,可以使用内部扰流板):

  

把它放在你的i - k上面  k = k%n

修复代码的原因是:

  

它计算出在我们完全循环x次后剩下多少次旋转。这样我们就不必担心多次轮换了。

-
作为这个挑战的旁注,你可以使用切片来做一些有趣的事情,使用这里介绍的一些内容来旋转数组:https://tour.golang.org/moretypes/10

答案 1 :(得分:0)

您的大多数代码都是正确的,但是它失败了,因为您只检查j&lt; 0一次。添加n后仍为负数,因此失败。 运行代码并在失败时打印值会给出: n:515,k:100000,q:500,j:-99477

修复很简单,将你的if改为for。这将继续添加n,直到你的索引再次出现。

修正:

package main

import "fmt"

func CircularArrayRotation() {
    var n, k, q int

    fmt.Scanf("%d%d%d", &n, &k, &q)
    a := make([]int, n)
    for i := range a {
        fmt.Scanf("%d", &a[i])
    }

    var i int
    for t := 0; t < q; t++ {

        fmt.Scanf("%d", &i)
        j := i - k
        for j < 0 {
            j += n
        }

        fmt.Println(a[j])
    }

}

func main() {
    //Enter your code here. Read input from STDIN. Print output to STDOUT
    CircularArrayRotation()
}