第一行:行0
中的字符位于索引2*(numRows-1)
处;
最后一行:行numRows−1
中的字符位于索引2(numRows−1)k+numRows−1
处;
内部的行:行i
中的字符位于索引2(numRows−1)k-i
以及2(numRows−1)k+numRows+1
处;
将每个向下以及向右上的部分看作一个循环。
对于示例2,循环1:LEET CO;循环2:DEIS HI;循环3:RING
string convert(string s, int numRows) {
if(numRows==1) return s;
int n = s.size();
int cyc = 2*(numRows-1);
string res;
//i表示行号
for(int i=0;i<numRows;++i){
//j表示每个循环的开始序号
for(int j=0;j+i<n;j+=cyc){
//此处加的是每个循环向下的部分
res += s[j+i];
//不是第一行,不是最后一行,索引在n的范围内,则该行还有向右上的部分
if(i!=0 && i!=numRows-1 && j+cyc-i<n)
res += s[j+cyc-i];
}
}
return res;
}