将一个给定字符串 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;
}
};