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