首页 > 代码库 > 64. ZigZag Conversion

64. ZigZag Conversion

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

思路:

方法1: 刚开始正着方三个,然后反着放两个,正着放两个。直到结束。(优)

class Solution {public:    string convert(string s, int nRows) {        if(nRows <= 1 || s == "") return s;        int len = s.length();		string s2[nRows];        int k = 0, k2 = 0;        while(k2 < len){            while(k < nRows && k2 < len) s2[k++].push_back(s[k2++]);			k--;            while(k > 0 && k2 < len) s2[--k].push_back(s[k2++]);			k++;        }        string s3;        for(int i = 0; i < nRows; ++i) {            s3 += s2[i];        }        return s3;    }};

 方法二: 类似方法一,不过存下每个位置的字符应该放的地方。然后依次读入。

class Solution {public:    string convert(string s, int nRows) {        if(nRows <= 1 || s == "") return s;        int len = s.length();		vector<int> index(2*nRows-2);		int t = 0;		for(int i = 0; i < nRows; ++i) index[t++] = i;		for(int j = nRows-2; j > 0; --j) index[t++] = j;		string s2[nRows];        int k = 0, m = 2*(nRows-1);          while(k < len){			s2[index[k % m]].push_back(s[k]);			k++;        }        string s3;        for(int i = 0; i < nRows; ++i) {            s3 += s2[i];        }        return s3;    }};

 

64. ZigZag Conversion