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 s, int numRows);
Example 1:
Input: s = “PAYPALISHIRING”, numRows = 3
Output: “PAHNAPLSIIGYIR”
Example 2:
Input: s = “PAYPALISHIRING”, numRows = 4
Output: “PINALSIGYAHRPI”
Explanation:
P I N
A L S I G
Y A H R
P I
方法一:傻瓜法
string convert(string s, int numRows)
{
int k = 0;
int i = 0;
int l = s.size();
if(l<=numRows||numRows==1)return s;
int temp;
string str;
vector<vector<char> > v(numRows);
while (i<l)
{
if (i % (2 * numRows - 2) < numRows)
{
if (i % (2 * numRows - 2) == 0)
k = 0;
temp=k;
v[k++].push_back(s[i]);
}
else
{
v[--temp].push_back(s[i]);
}
i++;
}
for (int i = 0; i < numRows; i++)
{
for(int j=0;j<v[i].size();j++){
str+=v[i][j];
}
}
return str;
}
方法二:
string convert(string s, int numRows)
{
string str;
int l = s.size();
int len = 2 * numRows - 2;
if (l <= numRows || numRows == 1)
return s;
for (int i = 0; i < numRows; i++)
{
for (int k = 0;k<l; k++)
{
if ((k - i) % len == 0 || k == len * (k / len + 1) - i)
{
str += s[k];
}
}
}
return str;
}
思路:依次添加元素,只要满足if里的条件则添加进去。
方法一:21小时
方法二:几秒前