黑客兰克循环数组旋转去运行时错误



我确实使用Go解决了一个黑客排名问题,即"圆形数组旋转" 当我运行代码时,它会给我一个正确的响应,当我尝试提交代码时,除了一个测试之外,所有测试都通过了,它说运行时错误

我在本地尝试了失败的测试,它通过了 我的代码是

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()
}

对于那些想要更多信息的人,你可以在这里看看:https://www.hackerrank.com/challenges/circular-array-rotation/problem

他失败案例的输入是这个,预期输出是这个

您的运行时错误如下:

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

goroutine1 [运行]:主。CircularArrayRotation() solution.go:22
+0x349 main.main() solution.go:29 +0x20

所以你的问题在第 22 行,你的索引超出了范围:fmt.Println(a[j])

发生这种情况是因为您的代码当前无法处理多个旋转,因此在您的代码中您最终会执行以下操作:

fmt.Println(a[-99477])

i8并且k100000时,就会发生这种情况

假设您有以下输入:

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

你的大部分代码都是正确的,但它失败了,因为你只检查j是否<0一次。将 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()
}

最新更新