将一个给定字符串 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);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
提示:
- 1 < = s . l e n g t h < = 1000 1 <= s.length <= 1000 1<=s.length<=1000
- s 由英文字母(小写和大写) 、 ′ , ′ 和 ′ . ′ 组成 s 由英文字母(小写和大写)、',' 和 '.' 组成 s由英文字母(小写和大写)、′,′和′.′组成
- 1 < = n u m R o w s < = 1000 1 <= numRows <= 1000 1<=numRows<=1000
找规律
 数字看为下标
 
 等差数列的首项和公差
第一行为首项是0,公差是2(n-1)的等差数列
中间是两个等差数列交错
最后一行是首项是n-1,公差是2(n-1)的等差数列
class Solution {
public:
    string convert(string s, int numRows) {
        string res;
        //特例
        if (numRows == 1) return s;
        for (int j = 0; j < numRows; j ++ )
        {
            //第一行或者最后一行
            if (j == 0 || j == numRows - 1)
            {
                for (int i = j; i < s.size(); i += (numRows-1) * 2)
                    res += s[i];
            }
            else
            {
                for (int k = j, i = numRows * 2 - 1 - j - 1;
                        i < s.size() || k < s.size();
                        i += (numRows - 1) * 2, k += (numRows - 1) * 2)
                {
                    if (k < s.size()) res += s[k];
                    if (i < s.size()) res += s[i];
                }
            }
        }
        return res;
    }
};




















