Transformación en forma de Z (Go, LeetCode)

Tabla de contenido

Descripción del Título

solución

Código

Tutorial de código

Portal


 

Descripción del Título

Organice una cadena de caracteres determinada en un patrón en zigzag de arriba hacia abajo y de izquierda a derecha de acuerdo con un número determinado de líneas. Por ejemplo, cuando la cadena de entrada es LEETCODEISHIRING y el número de filas es 3, la disposición es la siguiente:

L   C   I   R
E T O E S I I G
E   D   H   N

Después de eso, su salida debe leerse línea por línea de izquierda a derecha, lo que da como resultado una nueva cadena: LCIRETOESIIGEDHN

 

solución

Utilice el método de simulación para resolver imágenes vívidas.

Suponiendo que el número de filas es n, generamos n listas para representar n filas y definimos una variable de puntero para simular la tendencia en zigzag: bajar desde la primera fila sucesivamente, subir después de llegar a la última fila y repetir el ciclo hasta que todos los elementos estén atravesados.

Cada vez que la variable de puntero alcanza un elemento, el elemento se inserta en la lista del número correspondiente de filas. Finalmente, cada línea de caracteres será conectada y emitida, y se obtendrá el resultado deseado.

Análisis de complejidad: debido a que solo necesita atravesar la cuerda una vez, la complejidad del tiempo es  Sobre). Solo es necesario definir un número constante de variables, por lo que la complejidad del espacio es  O (1) .

 

Código

package main

import (
	"fmt"
	"strings"
)

func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	}

	pool := make([][]string, 0)
	for i := 0; i < numRows; i++ {
		pool = append(pool, make([]string, 0))
	}
	down := false
	currentLine := 0

	for _, c := range s {
		if currentLine == 0 || currentLine == numRows-1 {
			down = !down
		}

		pool[currentLine] = append(pool[currentLine], string(c))
		if down {
			currentLine++
		} else {
			currentLine--
		}
	}

	result := ""
	for i := range pool {
		line := strings.Join(pool[i], "")
		result += line
	}
	return result
}

 

Tutorial de código

package main

import (
   "fmt"
   "strings"
)

func convert(s string, numRows int) string {
   // 如果给定的行数只有一行,那么只需要将原字符串返回
   if numRows == 1 {
      return s
   }

   // 初始化存储每一行字符的二维切片
   pool := make([][]string, 0)
   for i := 0; i < numRows; i++ {
      pool = append(pool, make([]string, 0))
   }

   // down变量用来模拟Z字型游标的走向(flase向上,true向下)
   down := false

   // 游标指针变量,表示当前行数
   currentLine := 0

   for _, c := range s {
      // 如果游标抵达边界,需要改变方向
      if currentLine == 0 || currentLine == numRows-1 {
         down = !down
      }

      // 对应行添加字符
      pool[currentLine] = append(pool[currentLine], string(c))
      if down {
         currentLine++
      } else {
         currentLine--
      }
   }

   // 按照每一行字符依次拼接的方式输出结果
   result := ""
   for i := range pool {
      line := strings.Join(pool[i], "")
      result += line
   }
   return result
}

// 自测用例
func main() {
   fmt.Println(convert("LEETCODEISHIRING", 3))
}

 

Portal

Enlace a la pregunta de prueba de LeetCode

Supongo que te gusta

Origin blog.csdn.net/TCatTime/article/details/107074091
Recomendado
Clasificación