ホームページ >バックエンド開発 >Golang >タイムアウトを回避するために SPOJ ソリューションを最適化するにはどうすればよいですか?

タイムアウトを回避するために SPOJ ソリューションを最適化するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-28 11:18:24470ブラウズ

How Can I Optimize My SPOJ Solution to Avoid Timeouts?

SPOJ の入力スキャンの高速化

デフォルトの入出力関数 (fmt.Scan および fmt.Println) が原因で SPOJ ソリューションがタイムアウトになります。比較的遅いです。入力の読み取りを高速化するには、bufio.Scanner.Text() を使用する代わりに、bufio.Scanner を利用して標準入力から行を読み取ります。

整数変換の最適化

テキスト表現を取得し、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。