Skip to content

Latest commit

 

History

History
104 lines (84 loc) · 2.08 KB

6Z字形变换.md

File metadata and controls

104 lines (84 loc) · 2.08 KB

6Z字型变换

题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

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

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

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

string convert(string s, int numRows);

示例1

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例2

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

方法一:

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        vector<string> strings(numRows);
        auto p = s.begin();
        bool forward = true;
        int i = 0;
        while(p<s.end()){
            if(forward){
                strings[i].push_back(*p);
                ++p;
                if(i!=numRows-1) ++i;
                else{
                    forward = false;
                    --i;
                }
            }else{
                strings[i].push_back(*p);
                ++p;
                if(i!=0) --i;
                else{
                    forward = true;
                    ++i;
                }
            }
        }
        string res;
        for(string str:strings) res.append(str);
        return res;
    }
};

代码优化:

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;

        vector<string> rows(min(numRows, int(s.size())));
        int curRow = 0;
        bool goingDown = false;

        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }

        string ret;
        for (string row : rows) ret += row;
        return ret;
    }
};