6. ZigZag Conversion

https://leetcode.com/problems/zigzag-conversion/description/
题目大意:给一个字符串和n,要求按n行的“之”字形来输出
解题思路:如下图:

/*n=numRows
Δ=2n-2    0                           2n-2                           4n-4
Δ=        1                     2n-3  2n-1                    4n-5   4n-3
Δ=        2               2n-4        2n                 4n-6         .
Δ=        .             .               .               .             .
Δ=        .       n+1                 .           3n-1                .
Δ=        n-2   n                     3n-4    3n-2                   5n-6
Δ=2n-2    n-1                         3n-3                           5n-5
*/

两列之间的差为2n-2(n为行号),其中除第0行和第n-1行,其余都有“之”字形,如第1行的2n-3,然而两列间差不变,仍为2n-2.中间量的公式为:

  +2(n-1-1)       +2*1
1-----------2n-3----------2n

即第一步+2(n-1-i),第二步+2*i,i为行号。
如此即可。
此外还要考虑特殊情况:numRows=1,此时会进入无限循环,因此要特殊处理。

代码:

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;  //特殊处理
        int len = s.length();
        string result = "";
        for (int i = 0; i < numRows; i++) {
            int step1 = 2*(numRows-1-i);
            int step2 = 2*i;
            int pos = i;
            result += s[pos];
            while (1) {
                pos += step1;
                if (pos >= len) break;
                if (step1) result += s[pos];  //防止重复输出(n=0和n=numRows-1pos += step2;
                if (pos >= len) break;
                if (step2) result += s[pos];  //防止重复输出
            }
        }
        return result;
    }
};

python:
c++vector访问越界没有报错,py才体现出来,因此与上面相比,注释处多加了判断,对每行,初始化时就保证s的下标不能越界,一旦越界就退出。

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows == 1:
            return s
        length = len(s)
        result = ""
        for i in range(numRows):
            step1 = 2*(numRows-1-i)
            step2 = 2*i
            pos = i
            if pos >= length:  #判断是否越界
                break
            result += s[pos]
            while True:
                pos += step1
                if pos >= length:
                    break
                if step1:
                    result += s[pos]
                pos += step2
                if pos >= length:
                    break
                if step2:
                    result += s[pos]
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值