Maison > développement back-end > Golang > Comment puis-je optimiser ma solution SPOJ pour éviter les délais d'attente ?

Comment puis-je optimiser ma solution SPOJ pour éviter les délais d'attente ?

DDD
Libérer: 2024-12-28 11:18:24
original
477 Les gens l'ont consulté

How Can I Optimize My SPOJ Solution to Avoid Timeouts?

Analyse d'entrée plus rapide pour SPOJ

Votre solution SPOJ expire car les fonctions d'entrée et de sortie par défaut (fmt.Scan et fmt.Println) sont relativement lents. Pour obtenir une lecture d'entrée plus rapide, utilisez bufio.Scanner pour lire les lignes de l'entrée standard.

Optimisation pour la conversion d'entiers

Au lieu d'utiliser bufio.Scanner.Text() pour obtenir la représentation textuelle puis la convertir en entier à l'aide de strconv.Atoi(), utilisez une fonction de conversion dédiée pour extraire le nombre directement des octets bruts renvoyés par bufio.Scanner.Bytes(). Cette méthode évite les conversions de chaînes inutiles et l'allocation de mémoire, améliorant considérablement les performances.

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

Solution optimisée complète

La solution optimisée suivante lit les entrées beaucoup plus rapidement et répond au SPOJ. exigences relatives aux délais :

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
}
Copier après la connexion

Supplémentaires Notes

  • La solution suppose une saisie valide avec au moins n lignes après l'en-tête.
  • Pour une saisie fermée après n 1 lignes, une boucle simplifiée peut être utilisée :
for scanner.Scan() {
    if toInt(scanner.Bytes())%k == 0 {
        c++
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal