如题:
字符串 s 是以 Z字形为顺序存储的字符串,目标是按行打印。
设 numRows 行字符串分别为 s_1 , s_2 ,…, s_n,则容易发现:按顺序遍历字符串 s 时,每个字符 ch 在 Z 字形中对应的 行索引先从 s_1增大至 s_n,再从 s_n减小至 s_1…… 如此反复。
因此,解决方案为:模拟这个行索引的变化,在遍历 s 中把每个字符填到正确的行 row[i]
按顺序遍历字符串 s;
row[i] += ch: 把每个字符 ch 填入对应行 s_i;
ret +=dir?1:-1;: 更新当前字符 ch 对应的行索引;
dir=!dir;: 在达到 Z字形转折点时,执行反向。
class Solution {
public:
inline string convert(string &s, int &numRows) {
if(min(s.size(),numRows)==1) return s;
vector<string> row(min(s.size(),numRows));//防止元素个数少于行数
bool dir=false;
int ret=0;
for(auto ch:s){
row[ret] +=ch;
if(ret==0||ret==numRows-1){
dir=!dir;
}
ret +=dir?1:-1;
}
string res;
for(auto ch:row){
res +=ch;
}
return res;
}
inline int min(int a,int b){
return a>b?b:a;
}
};