LeetCode 6. ZigZag Conversion


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


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;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值