6. ZigZag Conversion

来源:互联网 发布:hyper v配置nat网络 编辑:程序博客网 时间:2024/06/07 04:10

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

class Solution {public:    string convert(string s, int r) {        if(r == 1) return s;        string res;        int n = s.size();        for(int i = 0; i < r; i++){            int start = i, interval1 , interval2;            int gap = 2 * r - 2;            if(i == 0 || i == r - 1) interval1 = interval2 = gap;            else{                interval1 = gap - 2 * i;                interval2 = gap - interval1;                            }            int k = 0;            while(1){                int pos = start + interval1 * ((k + 1) / 2) + interval2 * (k / 2);                if( pos < n){                    res.push_back(s[pos]);                    k++;                }                else                    break;            }        }        return res;    }};
一种很聪明的解法

class Solution {public:    string convert(string s, int numRows) {        vector<string> vs(numRows, "");        int n = s.length(), i = 0;        while (i < n) {            for (int j = 0; j < numRows && i < n; j++)                vs[j].push_back(s[i++]);            for (int j = numRows - 2; j >= 1 && i < n; j--)                vs[j].push_back(s[i++]);        }        string zigzag;        for (string v : vs) zigzag += v;        return zigzag;    } };


0 0