将字符串 "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
code
class Solution {
public:
string convert(string s, int numRows) {
int r = numRows;
int len = s.length();
string str;
if(r==1 || r>=len) return s;
else if(r==2){
for(int i=0;i<len;i+=2)
str.push_back(s[i]);
for(int i=1;i<len;i+=2)
str.push_back(s[i]);
return str;
}
if(r<len && r>2)
for(int i=0;i<r;i++){ //i is row
str.push_back(s[i]);
if(i==0)
for(int j=2;j*(r-1)<len;j+=2) //j is cloumn
str.push_back(s[j*(r-1)]);
else if(i==(r-1))
for(int j=3;j*(r-1)<len;j+=2)
str.push_back(s[j*(r-1)]);
else
for(int j=1;2*j*(r-1)-i<len;j++){
int num = 2*j*(r-1)-i;
str.push_back(s[num]);
if(num + 2*i <len)
str.push_back(s[num + 2*i]);
}
}
return str;
}
};
采用按行访问,每个元素访问一次,时间复杂度为O(n).