6. Z字形变换
程序员文章站
2022-04-17 16:37:25
...
- 同时控制方向和行数
- 如何定义vector数组
vector<string> rows(num) //初始化
string s = rows[n] //使用
- string的使用
string s = s1+s2; // 把s1和s2连接成新串 返回新串
string s += 'c'; //+=, s.append(), s.push_back() 在尾部添加字符
- 三元操作符替换if-else判断语句
思路
通过从左向右迭代字符串,确定字符位于 Z 字形图案中的哪一行。
用 min(numRows,len(s)) 个列表来表示 Z 字形图案中的非空行。
从左到右迭代 s,将每个字符添加到合适的行。
使用当前行和当前方向这两个变量对合适的行进行跟踪。
当移动到最上面的行或移动到最下面的行时,当前方向才会发生改变。
//时间复杂度O(n),空间复杂度O(n)
//同时控制方向和行数
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)
return s;
//可能打印的行数
int len = min(int(s.size()), numRows);
//定义vec来存储每一行
vector<string> rows(len);
bool goDown = false; //方向
int curLoc = 0;
int curRow = 0;
while(curLoc < s.size())
{
rows[curRow] += s[curLoc]; //string添加字符
curLoc++;
//方向的判断
if(curRow == 0 || curRow == len -1)
goDown = !goDown;
curRow += goDown?1:-1; //根据方向加减行数
}
string ans;
for(int i = 0; i < len; i++)
ans+=rows[i]; //string添加字符串
return ans;
}
};