1. 题目描述
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”.
2. 解决思路
这道题的关键是推算“之“字形的空格打印公式,具体代码如下。
3. 完整代码
#include <iostream>
#include <string>
using namespace std;
void printZigzag(const string &s, int nRows)
{
if (s.empty() || nRows < 1)
return;
if (nRows == 1)
{
cout << s << endl;
return;
}
int zigSpan = nRows * 2 - 2;
int zig = nRows - 2;
for (int i = 0; i < nRows; i++)
{
for (int j = i; j < s.length(); j+=zigSpan)
{
cout << s[j];
//注意:推导出zigSpan+j-2i的数学公式一点都不能错
if (i != 0 && i != nRows - 1 && zigSpan+j-2*i<s.length())
{
for (int r1 = 0; r1 < zig - i; r1++)
{
cout << " ";
}
cout << s[zigSpan + j - 2 * i];
for (int r2 = 0; r2 < i-1; r2++)
{
cout << " ";
}
}
else
{
for (int r = 0; r < zig; r++)
{
cout << " ";
}
}
}
cout << endl;
}
}
int main()
{
string str1;
printf("请输入任意字符串:\n");
cin >> str1;
int nRows;
printf("请输入列数:\n");
cin >> nRows;
printZigzag(str1, nRows);
system("pause");
return 0;
}