【问题标题】:How can i optimize this code to not get time limit with golang?(codeforce 344A magnets)我如何优化此代码以不使用 golang 获得时间限制?(codeforce 344A 磁铁)
【发布时间】:2022-01-25 11:43:41
【问题描述】:
package main

import "fmt"

func main() {
    var n int
    var st1, st2 string

    fmt.Scan(&n)
    fmt.Scan(&st1)

    numMagnet := 0
    if st1 != "" {
        numMagnet = 1
    }

    for i := 0; i < n-1; i++ {
        fmt.Scan(&st2)
        if st1 != st2 {
            numMagnet++
        }
        st1 = st2
    }

    fmt.Println(numMagnet)
}

我为 codeforces 上的Magnets problem (344A) 问题编写了这段代码。此解决方案无法通过测试用例 7,我该如何优化此解决方案?

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: go optimization


【解决方案1】:

这是您的代码的修改版本:

magnet.go:

package main

import (
    "bufio"
    "bytes"
    "fmt"
    "io"
    "os"
    "strconv"
)

func nGroups(r io.Reader, w io.Writer) (int, error) {
    if _, ok := r.(*bufio.Reader); !ok {
        r = bufio.NewReader(r)
    }
    br := r.(*bufio.Reader)

    buf, err := br.ReadBytes('\n')
    if err != nil {
        return 0, err
    }
    n, err := strconv.Atoi(string(bytes.TrimSpace(buf)))
    if err != nil {
        return 0, err
    }

    ng := 0
    var prev byte
    for i := 0; i < n; i++ {
        m, err := br.ReadSlice('\n')
        if err != nil {
            if err != io.EOF || i < n-1 {
                return 0, err
            }
        }
        if m[0] != prev {
            ng++
        }
        prev = m[0]
    }
    return ng, nil
}

func main() {
    ng, err := nGroups(os.Stdin, os.Stdout)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(ng)
}

100,000 个磁铁的 Go 基准测试似乎表明它比您的版本更快。

rocka2q:
Benchmark100KR-8  1012    1177446 ns/op     4336 B/op       7 allocs/op
moogod:
Benchmark100KM-8     5  245167574 ns/op  5001715 B/op  200011 allocs/op

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2019-12-14
    • 2019-11-20
    • 2020-05-29
    • 2011-04-09
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多