我确实解决了一个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()
}
答案 0 :(得分:3)
对于那些想要了解更多信息的人,您可以在此处查看:https://www.hackerrank.com/challenges/circular-array-rotation/problem
您的运行时错误是这样的:
恐慌:运行时错误:索引超出范围
goroutine 1 [running]:main.CircularArrayRotation()solution.go:22
+ 0x349 main.main()solution.go:29 + 0x20
因此,您的问题位于第22行,您的索引超出范围:fmt.Println(a[j])
这是因为您的代码当前无法处理多个轮换,因此在您的代码中最终会执行以下操作:
fmt.Println(a[-99477])
当i
为8
且k
为100000
想象一下你有这个输入:
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()
}