【模拟算法系列】详解5道题- Z 字形变换

时间:2024-01-26 20:53:07

 分析题目:

解题思路:

 可以定义一个字符串用来保存结果,当遇到目标字符就利用string的+=来保存结果,所以我们只需知道需要保存的字符的顺序和位置即可

下面找规律按照①~④推得来:

class Solution {
public:
    string convert(string s, int numRows) {
        //处理边界情况【处理第一行时会死循环,报超出时间限制】
        if (numRows == 1) return s;

        string ret;//保存结果的字符串

        //1、处理第一行
        int d = 2 * numRows - 2, n = s.size();
        for (int i = 0; i < n; i += d) ret += s[i];

        //2、处理中间行
        for (int k = 1; k < numRows - 1; k++)//循环中间的每一行
        {
            for (int i = k, j = d - k; i < n || j < n; i += d, j += d)
            {   //两个元素哪个没走到头就加哪个
                if (i < n) ret += s[i];
                if (j < n) ret += s[j];
            }
        }

        //3、处理最后一行
        for (int i = numRows - 1; i < n; i += d) ret += s[i];

        return ret;
    }
};