题解——Leetcode 6. ZigZag Conversion 难度:Medium

来源:互联网 发布:安卓手机运行java应用 编辑:程序博客网 时间:2024/06/07 01:14

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this:

P   A   H   NA P L S I I GY   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".


本题输入是字符串,按照反复的“向下->向右上”模式排列,然后逐行输出。

题目看似复杂,其实只要把握住一个关键——字符串的走势。

我们将指针str指向一个字符串数组,其中每个字符串存储经过zigzag变换的字符串的一行。其实我们不用关心每行中各字符间隔是多少,只要明确其先后顺序即可。本解法模拟了字符串放置的方式,变量row表示字符串中字符正放置在哪行,变量step表示下次放置的位置相对于这次的步长(下一行步长为1,上一行步长为-1)。遍历字符串,开始时row=0,step=1,每次循环row递增1,直到row=numRows-1,这时row开始每次递减1,直到row=0,如此往复,将字符串中的字符放在相应的row中,最后按行遍历字符串即可。

class Solution {public:    string convert(string s, int numRows) {        if(numRows <= 1)            return s;                    int len = s.length();        string *str = new string[numRows];                int row = 0, step = 1;        for(int i = 0; i < len; i++){            str[row].push_back(s[i]);            if(row == 0)                step = 1;            if(row == numRows - 1)                step = -1;            row = row + step;        }                s.clear();        for(int j = 0; j < numRows; j++)            s.append(str[j]);                delete []str;        return s;    }};


0 0