将字符串 "PAYPALISHIRING"
以Z字形排列成给定的行数:
P A H N A P L S I I G Y I R
之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"
实现一个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "PAYPALISHIRING", numRows = 3 输出: "PAHNAPLSIIGYIR"
示例 2:
输入: s = "PAYPALISHIRING", numRows = 4 输出: "PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
思路:找规律!可以先将字符串按不同的行数在纸上写一写,找到字符访问间隔的规律。规律是:第一行访问间隔为2n-2和0(0间隔为0只是为了方便理解,不用重复访问);第二行访问间隔为2n-4和2;第三行间隔为2n-6和4......以此类推。
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1) return s;
string res(s.size(),' ');
int j=0;
int r=0,l=2*(numRows-1);
for(int i=0;i<numRows;++i){
int m=i;
while(m<s.size()){
res[j++]=s[m];
if(l==0||r==0){
m=m+r+l;
} else {
m+=l;
if(m<s.size()){
res[j++]=s[m];
m+=r;
}
}
}
l=l-2;
r=r+2;
}
return res;
}
};