题目描述:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列(实际是N字形排列)
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
输出:"LCIRETOESIIGEDHN"
方法一:直接遍历
思路:时间复杂度O(n),空间复杂度O(n)
【1】申请行数为min(字符串长度,行数)的数组,存储每行的字符
【2】对字符串进行遍历,每到达顶端或底端对方向进行逆转
【3】对各数组进行拼接
string convert(string s, int numRows) {
if (numRows == 1) //只有一行
return s;
int length = s.length();
int capacity = min(length, numRows);
vector<string> vec(capacity); //存放每行字符的容器
int flag = 1, index = 0; //表明方向,容器下标
for (int i = 0;i < s.length();++i) {
vec[index] += s[i];
index += flag;
//到达顶端或底端改变方向
if (index == 0 || index == numRows - 1) {
flag *= -1;
}
}
//进行拼接
string ans = "";
for (int i = 0;i < capacity;++i) {
ans += vec[i];
}
return ans;
}