Leetcode 6. ZigZag Conversion

https://leetcode.com/problems/zigzag-conversion/

class Solution {
public:
    
    string convert(string s, int numRows) {
        /*
        对于第k行[0...numRows-1],
        若当前方向是向上,则下一次字符为当前位置+2*k【注意k=0的特殊情况】
        若当前方向是向下,则下一次字符为当前位置+2*(numRows-1-k)【注意k=numRows-1的特殊情况】
        对于下一字符不变的跳过即可
        【注意第一行和最后一行可能重合,若不进行处理会导致TL】
        */
        if(numRows==1) return s;//第一行和最后一行重合的情况
        string ans;
        for(int k=0;k<numRows;++k){
            int idx=k;
            int next=numRows-1-k;//代表方向,开始方向总是向下的
            while(idx<s.size()){
                ans.push_back(s[idx]);
                if(next==0) 
                    next=numRows-1-next;///改变方向
                idx += 2*next;
                next=numRows-1-next;///改变方向
            }
        }
        return ans;
    }
};

python版本

def idx_pp(idx,L):
    idx+=1
    return idx if idx<L else idx-L
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows<2: return s
        A=[[] for i in range(numRows)]
        delta=[1]*(numRows-1)+[-1]*(numRows-1)
        idx_A=0
        idx_delta=0
        for x in s:
            A[idx_A].append(x)
            idx_A+=delta[idx_delta]
            idx_delta=idx_pp(idx_delta,len(delta))
        return ''.join([''.join(x) for x in A])

posted @ 2019-04-25 16:11  benda  阅读(72)  评论(0编辑  收藏  举报