es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo optimizar este código para no exceder el límite de tiempo en Golang? (código de Force 344A imanes)

package main

import "fmt"

“`func main() {
var n int
var st1, st2 string

<pre><code>fmt.Scan(&n)
fmt.Scan(&st1)

numMagnet := 0
if st1 != "" {
numMagnet = 1
}

for i := 0; i < n-1; i++ {
fmt.Scan(&st2)
if st1 != st2 {
numMagnet++
}
st1 = st2
}

fmt.Println(numMagnet)
</code></pre>

}
“`

He escrito este código para el problema “Magnets” (344A) en Codeforces. Esta solución no pudo pasar el caso de prueba 7, ¿cómo puedo optimizar esta solución?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay algunas formas posibles de optimizar este código:

    1. Evite usar fmt.Scan para la entrada. En su lugar, use bufio.Scanner, que es más rápido y admite la lectura de entradas desde archivos también.
    2. Evite crear strings innecesarias. En lugar de leer las strings de entrada en las variables st1 y st2, simplemente puede comparar directamente los imanes actual y anterior en el bucle.

    3. Evite comparaciones innecesarias. Dado que cada imán está en un polo Norte o Sur, solo hay dos valores posibles para st1 y st2. Por lo tanto, puede reemplazar la comparación de strings con una simple comparación de enteros entre 1 y -1.

    Aquí hay una versión optimizada del código:

    package main
    
    import (
        "bufio"
        "os"
        "strconv"
    )
    
    func main() {
        scanner := bufio.NewScanner(os.Stdin)
        scanner.Scan()
        n, _ := strconv.Atoi(scanner.Text())
    
        prev, numMagnet := 0, 0
        for i := 0; i < n; i++ {
            scanner.Scan()
            curr, _ := strconv.Atoi(scanner.Text())
            if curr != prev {
                numMagnet++
            }
            prev = curr
        }
    
        println(numMagnet)
    }
    

    Esta versión utiliza bufio.Scanner para leer la entrada y strconv.Atoi para convertir las strings de entrada a enteros. No crea ninguna string innecesaria y utiliza enteros para representar los imanes. También evita comparaciones innecesarias al comparar enteros directamente.

Comments are closed.