题目描述: 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。( 事实上我觉得用N字形变换最准确,因为题目的意思就是把原始字符串先按照N的顺序排列,最后再输出)
比如输入字符串为 "LEETCODEISHIRING"
行数为 3 时,排列如下:
L C I R E T O E S I I G E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
我的方法就是把遍历原始字符串,然后把他们放到对应的行,每一行都是一个新字符串。就拿上面举例,L是第0行,E是第1行,第二个E是第二行,接着倒序,T又是第二行。最后又把每一行的字符串合并起来,即为结果。
string convert(string s, int numRows) {
string result = "";
if(numRows == 1) return s;
vector<string> rows(min(numRows, int(s.size())));
int currRow = 0;
bool goDown = true;
for(int i = 0; i < s.length(); i++) {
rows[currRow] += s[i];
if(goDown == true) {
currRow++;
}
else
currRow--;
if(currRow == numRows - 1 || currRow == 0)//当到达底部或者顶部时
goDown = !goDown; //改变goDown的值来确定行数变化的方向
}
for(string row : rows)
result += row;
return result;
}