首页 > 解决方案 > 如何旋转数组

问题描述

我正在尝试从 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

解决方案


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

推荐阅读