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 }
附加注意
for scanner.Scan() { if toInt(scanner.Bytes())%k == 0 { c++ } }
以上是如何优化我的 SPOJ 解决方案以避免超时?的详细内容。更多信息请关注PHP中文网其他相关文章!