Heim >Backend-Entwicklung >Golang >Wie kann ich meine SPOJ-Lösung optimieren, um Zeitüberschreitungen zu vermeiden?

Wie kann ich meine SPOJ-Lösung optimieren, um Zeitüberschreitungen zu vermeiden?

DDD
DDDOriginal
2024-12-28 11:18:24475Durchsuche

How Can I Optimize My SPOJ Solution to Avoid Timeouts?

Schnelleres Eingabe-Scannen für SPOJ

Ihre SPOJ-Lösung läuft wegen der standardmäßigen Eingabe- und Ausgabefunktionen (fmt.Scan und fmt.Println) ab. sind relativ langsam. Um ein schnelleres Lesen von Eingaben zu erreichen, verwenden Sie bufio.Scanner, um Zeilen aus der Standardeingabe zu lesen.

Optimierung für Ganzzahlkonvertierung

Anstelle von bufio.Scanner.Text() Um die Textdarstellung zu erhalten und sie dann mit strconv.Atoi() in eine Ganzzahl umzuwandeln, verwenden Sie eine spezielle Konvertierungsfunktion, um die Zahl direkt aus den von zurückgegebenen Rohbytes zu extrahieren bufio.Scanner.Bytes(). Diese Methode vermeidet unnötige String-Konvertierungen und Speicherzuweisungen und verbessert die Leistung erheblich.

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

Vollständig optimierte Lösung

Die folgende optimierte Lösung liest Eingaben viel schneller und erfüllt die SPOJ Zeitlimitanforderungen:

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
}

Zusätzlich Hinweise

  • Die Lösung setzt eine gültige Eingabe mit mindestens n Zeilen nach dem Header voraus.
  • Für geschlossene Eingaben nach n 1 Zeilen kann eine vereinfachte Schleife verwendet werden:
for scanner.Scan() {
    if toInt(scanner.Bytes())%k == 0 {
        c++
    }
}

Das obige ist der detaillierte Inhalt vonWie kann ich meine SPOJ-Lösung optimieren, um Zeitüberschreitungen zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn