字形变换
将一个给定字符串 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 • 1 • 2 • 3 • 4 • 5 • 6 • 7
示例 3:
输入: s = "A", numRows = 1 输出: "A"
提示:
- 1 <= s.length <= 1000
- s 由英文字母(小写和大写)、',' 和 '.' 组成
- 1 <= numRows <= 1000
我的代码:
class Solution { public: string convert(string s, int numRows) { // 直接输出结果的可能 if (numRows == 1 || numRows > s.size()) return s; vector<string> a(numRows); string res; // 标记点 这一步是这个题的点睛之笔 其实你看这个z字像不像是一个波函数 // 或者是一个无损耗的自由落体运动 // 然后就可以物理的加速度的方式来理解这个题了 然后就会变得很简单 int flag = -1; int t = 0; for (int i = 0; i < s.size(); ++ i) { a[t] += s[i]; // 这个关键的节点就像是物理里面自由落体运动的小球的速度为0的两个点 if (t == 0 || t == numRows - 1) flag = -flag; t += flag; } for (int i = 0; i < a.size(); ++ i) res += a[i]; return res; } };