go - 如何旋转数组
问题描述
我正在尝试从 HackerEarth 解决这个问题。 https://www.hackerearth.com/practice/codemonk/
这基本上是旋转阵列的问题。对于大多数测试用例,我的答案都是正确的,除了 Input #5。它说超过了时间限制。我正在使用 golang 来解决它。我已经尝试过使用 C++ 的类似方法并且没有这样的问题。有人知道如何在golang中解决这个问题吗?
下面是我的代码:
package main
import (
"fmt"
)
func main() {
var T int
fmt.Scan(&T)
for T>0 {
var N, K int
fmt.Scan(&N)
var arr = make([]string, N)
fmt.Scan(&K)
for i:=0; i<N; i++ {
fmt.Scan(&arr[i])
}
K = K%N
for i:=0; i<N; i++ {
offset := (i + (N-K)) % N
fmt.Printf("%s ", arr[offset])
}
fmt.Println()
T -= 1
}
}
解决方案
go中默认不缓存stdin和stdout,fmt.Scan
很可能一次从stdin读取一个字符,导致大量的低效。使用的代码版本bufio.NewReader
在我的机器上运行速度要快得多(尽管我使用的 WSL 没有很好的 io 性能)。
如果这还不够快,接下来要尝试的是缓冲输出而不是直接写入 os.Stdout。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var T int
in := bufio.NewReader(os.Stdin)
fmt.Fscan(in, &T)
for T > 0 {
var N, K int
fmt.Fscan(in, &N)
var arr = make([]string, N)
fmt.Fscan(in, &K)
fmt.Println(T, N, K)
for i := 0; i < N; i++ {
fmt.Fscan(in, &arr[i])
}
K = K % N
for i := 0; i < N; i++ {
offset := (i + (N - K)) % N
fmt.Printf("%s ", arr[offset])
}
fmt.Println()
T -= 1
}
}
推荐阅读
- unity3d - Unity 空白编译器错误,没有详细信息
- unity3d - Mesh Collider 允许游戏对象在 Unity 游戏中爬过
- asp.net-core - 将一些剃刀页面放在不同的程序集中 - blazor
- c - sizeof() 语句是在编译时还是运行时评估的?
- python - Keras 中 Adam 优化器的衰减参数
- javascript - 为客户取消“一周试用”的最佳惯例?
- c# - 悬停圆角按钮使用 ResourceDictionary 更改其背景颜色
- css - 如何避免 Laravel Mix 覆盖 app.css
- c++ - 包括我
,但编译器在 MonitorFromWindow 抛出“未声明” - arrays - 数据行到字符串到数组问题