【LeetCode】8.ZigZag Conversion

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".

首先理解题目ZigZag的意思。ZigZag Conversion即把字符串的字符按照Z字形重新排列,Z字形横过来看就是N字形。nRows=3的情况如上图所示,nRows=4应为

0        6

1  4    7

2    5  8

3        9

而不是

0      5

1  4  6

2      7

3      8

也就是中间应有nRows-2个数,而不是只有一个,这个一开始我理解错了。

那么特殊情况,nRows=1时,简单,直接返回s。

nRows=2时,

0  2

1  3

还是下面这种?

0      3

1  2  4  

应该是第一种。

思路: 把s按照下标,以nRows+nRows-2为单位装入nRows个字符串数组中,然后挨个append到要输出的字符串后面即可。算法的复杂度为O(n)。

class Solution {
public:
    string convert(string s, int nRows) {
        // Note: The Solution object is instantiated only once and is reused by each test case.    
        if (nRows <= 1 )  
            return s;  
        string* s_array=new string[nRows];
        int n=nRows+nRows-2;
        int w=0;
        for(int i=0;i<s.length();i++){
            w=nRows-1-abs(nRows-1-i%n);
            s_array[w].push_back(s[i]); 
        }
        string str_result;  
        for (int i = 0; i < nRows; ++i)  
            str_result.append(s_array[i]);  
  
        return str_result;
    }
};
原文地址:https://www.cnblogs.com/guozhiguoli/p/3353410.html