1. 概述
题目的原文是这样的:
The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I RAnd then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
它需要的便是输入一个字符串,就输出Z字形的字符串====》说到底就是坐标变换的规则,下面以13个字符的字符串(“abcdefghjklmno”),4行(用N表示)为例子进行说明:
从上面的表格中可以看到列(对应上表中不是斜线上的部分,如0,3列)的坐标规则是f(x) = x + i*(2*N-2),i=0,1,2,3,4...
斜线上的坐标为:f(x) = x + i*(2*N-2) - 2*x = i*(2*N-2) - x ; i=0,1,2,3...(i与上式中同义)
2. 编码
class Solution {
public:
string convert(string s, int numRows)
{
int m_strlen(s.length()); //获得字符串的长度
if(0==m_strlen || 1==m_strlen || 2==m_strlen || numRows==1 || numRows>=m_strlen)
return s;
char* data = new char[m_strlen+1];
for(int i=0; i<(m_strlen+1); i++)
data[i] = '\0';
int pos(0);
for(int i=0; i<m_strlen; i++)
{
if(i*(2*numRows-2) < m_strlen)
{
data[pos++] = s.at(i*(2*numRows-2));
}
else
break;
} //第一行的数据
int cols = pos+1;
for(int i=1; i<numRows-1; i++)
{
for(int j=0; j<cols; j++)
{
if(i + j*(2*numRows-2) < m_strlen)
{
if(i + j*(2*numRows-2)-2*i > 0)
data[pos++] = s.at(i + j*(2*numRows-2)-2*i); //该列前面的数
data[pos++] = s.at(i + j*(2*numRows-2)); //该列的数
}
else if((i + j*(2*numRows-2)) >= m_strlen && ((i+j*(2*numRows-2)-2*i) < m_strlen) &&
((i+j*(2*numRows-2)-2*i) > 0))
{
data[pos++] = s.at(i+j*(2*numRows-2)-2*i);
break;
}
}
} //z字型行走的行数
for(int i=0; i<cols; i++)
{
if(numRows-1 + i*(2*numRows-2) < m_strlen)
{
data[pos++] = s.at(numRows-1 + i*(2*numRows-2));
}
else
break;
} //最后一行的数据
string temp(data);
delete[] data;
data = nullptr;
return temp;
}
};