6.Z字形变换

题目描述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

思路

模拟Z字形形成的过程,设置numRows个接收缓冲区接收插入的字符

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1)
            return s;
        vector<string> rows(numRows);
        int cur_row = 0;
        int direct = 1; // 1表示方向向下,-1表示方向向上
        for (char c : s) {
            rows[cur_row].push_back(c);
            cur_row = cur_row + direct;
            if (cur_row == 0 || cur_row == numRows - 1)
                direct = -direct; // 到达顶部或底部时改变方向
        }
        string res;
        for (string substr : rows)
            res += substr;
        return res;
    }
};
Licensed under CC BY-NC-SA 4.0