提高输入扫描速度以加快程序执行速度
问题陈述
给定的代码尝试通过迭代数字列表并确定每个数字是否是来解决 SPOJ 问题可被常数 k 整除。然而,由于感知输入扫描速度较慢,执行超时。
解决方案
利用 bufio.Scanner
来增强输入扫描效率,我们可以利用bufio.Scanner,它是为高速逐行输入处理而定制的。我们使用 bufio.Scanner 来检索输入行,而不是默认的 fmt.Scan。
优化数字转换
为了改进数字转换,我们引入了 toInt()函数,它直接从原始输入字节中提取数字。这避免了 Scanner.Text() 的较慢转换方法,并消除了不必要的字符串创建。
toInt() 通过迭代输入字节并将结果逐渐乘以 10 来实现这一点。这些字节对应于 UTF-数字十进制表示形式的 8 个编码序列。
代码代码片段
下面修订后的代码片段包含了这些优化:
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 行。
对于涉及封闭输入的场景,可以使用简化的 for 循环:
for scanner.Scan() { if toInt(scanner.Bytes())%k == 0 { c++ } }
以上是bufio.Scanner 和优化的数字转换如何加速 Go 程序中的输入扫描?的详细内容。更多信息请关注PHP中文网其他相关文章!