6. Z 字形变换 - 力扣(LeetCode)
解法:模拟
思路:把原字符串从上到下依次读取到新字符串中,就需要看看Z字形变换时字符变化的规律。
以行数h=4时为例:
对于第一行和最后一行:
每一个字符的下标距离为:2*h - 2
对于中间行:
因为从第一行和最后一行可知,每一个A字符与下一个字符B都有公差的关系,所以只要把这个距离中间的字符X找出来,只要让A和X同时走公差步,就能遍历完一行。
以第二号行为例:A 和 L 要同时走公差步,首先要找到L:d-所在行第一个元素下标
细节
针对示例三,是有一行——>相当于原字符串没变换,直接返回即可。
class Solution
{
public:string convert(string s, int numRows) {if(numRows == 1)return s;string ret;int d = 2*numRows - 2;//1.第一行for(int i = 0;i<s.size();i += d)ret += s[i];//2.中间行for(int i = 1;i<numRows-1;i++){for(int k = i,j = d-i;k<s.size() || j<s.size();k += d,j += d){if(k < s.size())ret += s[k];if(j < s.size())ret += s[j];}}//3.最后一行for(int i = numRows - 1;i<s.size();i += d) ret += s[i];return ret;}
};