首页 >后端开发 >Golang >如何优化我的 SPOJ 解决方案以避免超时?

如何优化我的 SPOJ 解决方案以避免超时?

DDD
DDD原创
2024-12-28 11:18:24464浏览

How Can I Optimize My SPOJ Solution to Avoid Timeouts?

SPOJ 的更快输入扫描

您的 SPOJ 解决方案由于默认输入和输出函数(fmt.Scan 和 fmt.Println)而超时相对较慢。为了实现更快的输入读取,请使用 bufio.Scanner 从标准输入读取行。

优化整数转换

而不是使用 bufio.Scanner.Text()要获取文本表示形式,然后使用 strconv.Atoi() 将其转换为整数,请使用专用转换函数直接从返回的原始字节中提取数字bufio.Scanner.Bytes()。此方法避免了不必要的字符串转换和内存分配,显着提高了性能。

func toInt(buf []byte) (n int) {
    for _, v := range buf {
        n = n*10 + int(v-'0')
    }
    return
}

完整的优化解决方案

以下优化解决方案读取输入速度更快,并且满足 SPOJ时限要求:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    var n, k, c int
    scanner := bufio.NewScanner(os.Stdin)

    scanner.Scan()
    fmt.Sscanf(scanner.Text(), "%d %d", &n, &k)

    for ; n > 0; n-- {
        scanner.Scan()
        if toInt(scanner.Bytes())%k == 0 {
            c++
        }
    }

    fmt.Println(c)
}

func toInt(buf []byte) (n int) {
    for _, v := range buf {
        n = n*10 + int(v-'0')
    }
    return
}

附加注意

  • 该解决方案假定标题后至少有 n 行有效输入。
  • 对于 n 1 行之后的闭合输入,可以使用简化的循环:
for scanner.Scan() {
    if toInt(scanner.Bytes())%k == 0 {
        c++
    }
}

以上是如何优化我的 SPOJ 解决方案以避免超时?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn