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
- 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
- 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;
}
};