力扣题库六:z字形变换

题目:

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion

Z字形排列如下图:

力扣题库六:z字形变换_第1张图片 

从图中可以知道在第一行和第n行方向改变,所以从左到右按箭头方向迭代 s ,将每个字符添加到合适的行。之后从上到下遍历行即可。

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1)
            return s;
        vector stringRow(min(numRows,int(s.size())));//防止s的大小比行数还小
        int curRow=0;
        bool goingDown=false;                    //改变箭头方向的标识
        for(char a : s)
        {
            stringRow[curRow]+=a;
            if(curRow==0 || curRow==numRows-1)
            {
                goingDown=!goingDown;
            }
            curRow+=goingDown?1:-1;
        }
        string ret;
        for(string row:stringRow)
        {
            ret+=row;
        }
        return ret;
    }
};

 

你可能感兴趣的:(C++)