ZigZag Conversion
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 R
And 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”.
Subscribe to see which companies asked this question
求解思路
假设要将字符串拆分为n排,则创建n个字符串数组,按照“N”形排列字符串即可。假如说abcdefghijklmno排列成4排,形式如下:
a………..g………m
b……f…h……l…n
c…e……i…k……o
d………..j…………..
代码实现
std::string convert(std::string s, int numRows)
{
if (numRows == 1)
return s;
std::vector<std::string> vStr(numRows,"");
vStr.reserve(numRows);
std::string medianRow("");
int len = 0;
int index = 0;
while (len != s.size())
{
while (index <numRows&&len != s.size())
{
if (vStr[index] == "")
vStr[index++].push_back(s[len++]);
else
vStr[index++] += s[len++];
}
--index; //index大小为vStr最大索引
while(index>=1&&len!=s.size())
{
--index;
vStr[index] += s[len++];
}
++index;
}
std::string rslt("");
for (int i = 0; i != vStr.size(); ++i)
{
if (i == numRows / 2)
{
rslt += medianRow;
if(medianRow!="")
std::cout << medianRow<<std::endl;
}
rslt += vStr[i];
std::cout << vStr[i] << std::endl;
}
return rslt;
}