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".
通过画图找规律
/**
由规律来看
第i排开始的数下标是i;
第一排和最后一排 的间距为 2*(N-1);
其他排的间距为 分别是2*(m-i) 2*(i-1)
*/
#include<iostream>
using namespace std;
class Solution {
public:
string convert(string s, int numRows) {
int length = s.size();
string result;//用于输出排序后的字符串
if ((numRows == 1) || (numRows>=length))
return s;
for (int i = 0; i < numRows; i++)
{
int j = i;
bool flag=true;
while (j < length)
{
result.push_back(s.at(j));//将排好序的字符插入到result中
if (i == 0 || i == numRows - 1)
{
j += 2 * (numRows - 1);
}
else
{
if (flag)
{
j += 2 * (numRows - 1-i);
flag = false;
}
else
{
j += 2 * i;
flag = true;
}
}
}
}
return result;
}
};
int main()
{
Solution s1;
string result=s1.convert("abcd", 2);
for (int i = 0; i <result.size(); i++)
{
cout << result[i] << ' ';
}
system("pause");
}
a c
b d
a c b d 请按任意键继续. . .