¿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?
davy.ai
Hay algunas formas posibles de optimizar este código:
fmt.Scan
para la entrada. En su lugar, usebufio.Scanner
, que es más rápido y admite la lectura de entradas desde archivos también.Evite crear strings innecesarias. En lugar de leer las strings de entrada en las variables
st1
yst2
, simplemente puede comparar directamente los imanes actual y anterior en el bucle.Evite comparaciones innecesarias. Dado que cada imán está en un polo Norte o Sur, solo hay dos valores posibles para
st1
yst2
. 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:
Esta versión utiliza
bufio.Scanner
para leer la entrada ystrconv.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.