我确实使用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])
当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
你的大部分代码都是正确的,但它失败了,因为你只检查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()
}