La conversión de la Leetcode en forma de Z

título Descripción

El número de una cadena dada de acuerdo a la fila dada, a abajo, de izquierda a derecha desde la disposición en forma de Z. Ejemplo, la cadena de entrada es el número de filas "LEETCODEISHIRING" es 3, dispuestas como sigue:

LCIR
ETOESIIG
EDHN
Después de eso, se necesita la salida de izquierda a derecha línea de lectura por línea, producir una nueva cadena, tales como: "LCIRETOESIIGEDHN".

pensamiento

  1. solución violenta para simular el proceso de transformación con el fin de obtener una respuesta, pero, gran capacidad de memoria que consume tiempo
  2. Encuentra la ley, nos encontramos con que la distancia entre la última línea en las dos primeras letras dispuestas a 2n-3, en lugar de la primera ley entre las dos letras es la última línea: Si el primer carácter se define como 0, el k-ésimo carácter cuando el número par, el siguiente paso de los caracteres es 2 * (n- línea-1), si k es impar, el siguiente carácter es un * línea de distancia 2. Este método sólo requiere n veces para atravesar la cuerda

código

Método uno:

string convert(string s, int numRows) {
        int len = s.length();
        if (len<2 || numRows == 1)
            return s;
        string res;
        int numCols = len / (numRows + numRows - 2)*(numRows - 1);
        if (len % (numRows + numRows - 2) != 0)
        {
            if (len % (numRows + numRows - 2) <= numRows)
                numCols++;
            else
                numCols += 1 + len % (numRows + numRows - 2) - numRows;
        }
        vector<vector<char>> Matrix(numRows, vector<char>(numCols));
        int x = 0, y = 0;
        for (int i = 0; i<len; i++)
        {
            Matrix[x][y] = s[i];
            if (y % (numRows - 1) == 0)
            {
                if (x<numRows-1)
                    x++;
                else
                {
                    x--;
                    y++;
                }
            }
            else
            {
                y++;
                x--;
            }
        }
        for (int i = 0; i<numRows; i++)
        {
            for (int j = 0; j<numCols; j++)
            {
                if (Matrix[i][j] != '\0')
                    res += Matrix[i][j];
            }
        }
        return res;
    }

Segundo método:

class Solution {
public:
    string convert(string s, int numRows) {
        int len = s.length();
        if (len<2 || numRows == 1)
            return s;
        string res;
        int line = 0;
        while (line<numRows)
        {
            int index = line;
            if (line == 0 || line == numRows - 1)
            {
                while (index<s.length())
                {
                    res += s[index];
                    index = index + 2 * (numRows-1) ;
                }
                line++;
            }
            else
            {
                int count = 0;
                while (index<s.length())
                {
                    res += s[index];
                    if (count % 2 == 0)
                        index = index + 2 * (numRows - line-1);
                    else
                        index = index + 2 * line;
                    count++;
                }
                line++;
            }
        }
        return res;
    }
};
Publicado 85 artículos originales · ganado elogios 0 · Vistas 377

Supongo que te gusta

Origin blog.csdn.net/weixin_38312163/article/details/105021815
Recomendado
Clasificación