题目原文
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”.
思路
最开始想的是直接依据规则来把输入的内容按行保存成列表,然后输出即可。
提交代码
string convert(string s, int nRows) {
vector<vector<char> > zigzag(nRows);
int row = 0;
for (size_t i = 0;i<s.size();i++)
{
int col = row/nRows;
if(nRows>1 && col%(nRows-1)!=0)
{
if(row%nRows == nRows-col%(nRows-1)-1)
{
zigzag[row%nRows].push_back(s[i]);
}
else
{
i--;
}
}
else
zigzag[row%nRows].push_back(s[i]);
row++;
}
string out="";
for (auto row:zigzag)
{
for(auto col:row)
{
out += col;
}
}
return out;
}
提交之后顺利的ac了,但是耗时比较长,想来是因为代码写得略微有点复杂,优化过后的代码可以写成这个样子,比较精巧:
string convert(string s, int nRows) {
if(nRows == 1)
return s;
vector<string> res(nRows);
int i = 0, j, gap = nRows-2;
while(i < s.size()){
for(j = 0; i < s.size() && j < nRows; ++j)
res[j].push_back(s[i++]);
for(j = gap; i < s.size() && j > 0; --j)
res[j].push_back(s[i++]);
}
string str = "";
for(auto itr : res)
{
str += itr;
}
return str;
}