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"
.
class Solution
{
public:
string convert(string s, int nRows)
{
int nsLen = s.length(),nFirst,nStrInd,nBlockLen;
if (nsLen <= nRows || nRows == 1)//判断序列长度是否超过行数或者行数是否为1
return s;
nBlockLen = 2 * nRows - 2;//将整个序列分块,计算每块的长度
nFirst = nBlockLen;//每行中第二个数据距离第一个数据的间隔
int nsBlock = nsLen / nBlockLen + 1;//计算块数
string sResult = "";
for (int nTemp = 0; nTemp < nRows; nTemp++)
{
sResult += s[nTemp];//将Z型中每行第一个符号添加到新建序列尾部
for (int nIndex = 0; nIndex < nsBlock; nIndex++)
{
nStrInd = nTemp + nBlockLen * nIndex + nFirst;
if (nFirst != 0 && nStrInd < nsLen && nStrInd >= 0)
{
sResult += s[nStrInd];
}
nStrInd = nTemp + nBlockLen * (nIndex + 1);
if (nFirst != nBlockLen && nStrInd < nsLen)
{
sResult += s[nStrInd];
}
}
nFirst = nFirst - 2;
}
return sResult;
}
};