欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

6. Z字形变换

程序员文章站 2022-04-17 16:37:25
...

6. Z字形变换

  1. 同时控制方向和行数
  2. 如何定义vector数组
	vector<string> rows(num)		//初始化
	string s = rows[n]		//使用
  1. string的使用
	string s = s1+s2;  // 把s1和s2连接成新串 返回新串
	string s += 'c'; //+=, s.append(), s.push_back() 在尾部添加字符 
  1. 三元操作符替换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;
    }
};