第八周作业2(LeetCode6)

来源:互联网 发布:tripmode mac 编辑:程序博客网 时间:2024/05/29 16:49

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;}
0 0