LeetCode 6. ZigZag Conversion

来源:互联网 发布:淘宝 手机 描述 模板 编辑:程序博客网 时间:2024/06/17 01:01


Description:


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);


For example:


convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.


分析:好吧我用的是最朴素的做法:若有更好的方法欢迎指出~
记 t = (numRows - 1) * 2
1. 找规律发现第一行下标是以0为首项,t 为公差的等差数列,循环输出之
2. 第二行至倒数第二行分别是以 i 和 t - i (i 为行下标)为首项,t为公差的等差数列交错输出
3. 最后一行为以 t / 2 为首项, t为公差的等差数列,循环输出之
大功告成~


Submission Details:
1158 / 1158 test cases passed.
Status: Accepted
Runtime: 22 ms

class Solution {public:    string convert(string s, int numRows) {        if (numRows == 1) {            return s;        }        string res = s; //用于保存输出字符串        int p, q, r = 0; //p,q扫描s,r扫描res        int len = s.length();        int t = (numRows - 1) * 2; //重复出现周期        for (int i = 0; i < numRows; i++) {            if (i == 0) { //处理第一行                p = 0;                while (p < len) {                    res[r++] = s[p];                    p += t;                }            } else if (i != t / 2) { //处理除了最后一行的其他行                p = i;                q = t - i;                while (p < len && q < len) {                    res[r++] = s[p];                    res[r++] = s[q];                    p += t;                    q += t;                }                if (p < len) {                    res[r++] = s[p];                }            } else { //处理最后一行                p = t / 2;                while (p < len) {                    res[r++] = s[p];                    p += t;                }            }        }         return res;    }};