Serie de cepillado aleatorio leetcode: transformación en zigzag

Serie de cepillado aleatorio leetcode: transformación en zigzag



1. Descripción del tema

leetcode 6. Transformación de fuente Z
Organice una cadena determinada s en zigzag de arriba a abajo y de izquierda a derecha de acuerdo con el número dado de filas numRows.
Por ejemplo, cuando la cadena de entrada es "PAYPALISHIRING" y el número de líneas es 3, la disposición es la siguiente:

P   A   H   N
A P L S I I G
Y   I   R

Después de eso, su salida debe leerse línea por línea de izquierda a derecha para generar una nueva cadena, por ejemplo: "PAHNAPLSIIGYIR".
Implemente esta función para convertir una cadena a un número específico de filas:
string convert(string s, int numRows);

Ejemplo 1:
Entrada: s = "PAYPALISHIRING", numRows = 3
Salida: "PAHNAPLSIIGYIR"

Ejemplo 2:
Entrada: s = "PAYPALISHIRING", numRows = 4
Salida: "PINALSIGYAHRPI"

解释:
P     I    N
A   L S  I G
Y A   H R
P     I

Ejemplo 3:
Entrada: s = "A", numRows = 1
Salida: "A"

pista:

1 <= s.length <= 1000
s consta de letras inglesas (minúsculas y mayúsculas), ',' y '.'
1 <= numRows <= 1000


2. Análisis del tema

Ideas para resolver problemas:

Esta pregunta puede considerarse como dividir una cadena en secuencia y reorganizarla y fusionarla en una nueva cadena de acuerdo con reglas específicas.

Se puede ver en el ejemplo que no importa cuántas filas tenga numRows, las reglas de reordenamiento de las cadenas divididas son las siguientes:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
y luego recomponga una cadena de la siguiente manera

P     I    N			PIN
A   L S  I G    ---->   ALSIG -----> PINALSIGYAHRPI
Y A   H R				YAHR
P     I					PI

Se puede ver que cuando numRows son pocos, la cadena se dividirá en varias cadenas nuevas, es decir, varias líneas, y se puede definir una matriz para almacenar cada cadena, y finalmente se devolverá un resultado de unión.

Tome el Ejemplo 2 como ejemplo, cuando numRows = 4, s es la cadena de entrada:

a = ['','','','']
s
// a0表示数组a索引为0的字符串 s0表示字符串s索引为0的字符
a0 P     I    N				PIN
a1 A   L S  I G    ---->   	ALSIG -----> 	PINALSIGYAHRPI
a2 Y A   H R				YAHR
a3 P     I					PI

a0 s0      s6       s13	
a1 s1   s5 s7   s12 s14
a2 s2 s4   s8 s10
a3 s3      s9

La relación enumerada anteriormente puede entenderse como empalmar cada carácter de s en la cadena de cada elemento de a por turno, cuando se empalma en la última cadena en a, luego invierte los caracteres en a a la inversa. La concatenación de cadenas elimina los caracteres en s uno. uno por uno, y repite así:

a0 a1 a2 a3 a2 a1 a0 a1 a2 a3.....
// 最后得到的a数组
a -> [PIN,ALSIG,YAHR,PI]
// 最终得到的字符串
a.join('') -> "PINALSIGYAHRPI"

Del análisis anterior, se puede ver que hay dos casos especiales
1. Cuando numRows == 1, solo habrá una línea de cadenas, no hay división ni empalme, y el resultado es directamente la entrada s
2. Cuando el carácter s Cuando la longitud de la cadena es menor que numRows, termina antes de que se realice el empalme inverso de la primera matriz. En este momento, a.join('') = s

if(numRows === 1 || numRows < s.length) return s

3. Código de resolución de problemas

El código se muestra a continuación:

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    
    
    if(numRows === 1) return s
    const a = [] //定义数组a
    // 初始数据
    for(let i = 0; i<numRows; i++){
    
    
        a[i] = ''
    }
    const l = s.length
    let j = 0
    // 控制反转 0时表示顺序 1表示逆序
    let reverse = 0
    for(let i = 0; i < l; i++){
    
    
    	// 反转的临界点在 0 与 a的最后一项 numRows - 1 出现时
        if(j === numRows - 1) {
    
    
            reverse = 1
        } else if(j === 0) {
    
    
            reverse = 0
        }
        // 拼接字符串
        a[j] += s[i]
        // 控制顺序
        if(reverse) j--
        else j++
    }
    return a.join('')
};

Supongo que te gusta

Origin blog.csdn.net/weixin_42508580/article/details/123577904
Recomendado
Clasificación