The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I RAnd then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
题意:编写一个函数,传入一个字符串和一个整数rows。
要求将字符串按照rows作为行数排列成 Z 型,然后再将排列好后的按照第一行,第二行.....第rows行输出。
分析:
令:mod = 2 * (rows - 1)。
令:字符串下标为0 ~ length-1。
那么有结论:对于字符串中下标为 i 的字符排列后所在行数为:
令: r = i % mod;
如果: r < mod 所在行即为第 r 行
如果: r >= mod 所在行即为第 rows - r 行。
所以准备好vector数组表示每一行的char。(这里也可以用str数组)
然后扫一遍源字符串,根据下标确定每个元素排列后的行数,加入对应的行。最后输出。
代码:
class Solution {
public:
vector<char> flag[10000];
char buf[100000];
string convert(string s, int numRows) {
if(numRows == 1)return s;
for(int i = 0 ; i < numRows ; i ++)
flag[i].clear();
int mod = 2*(numRows - 1);
for(int i = 0 ; i < s.length() ; i ++){
int r = i % mod;
if(r < numRows){
flag[r].push_back(s[i]);
}
else{
flag[mod-r].push_back(s[i]);
}
}
int tot = 0;
for(int i = 0 ; i < numRows ; i ++){
for(int j = 0 ; j < flag[i].size() ; j ++){
buf[tot++] = flag[i][j];
}
}
buf[tot] = '\0';
return string(buf);
}
};