题目:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING"
行数为 3 时,排列如下:
L C I R E T O E S I I G E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3 输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4 输出: "LDREOEIIECIHNTSG" 解释: L D R E O E I I E C I H N T S G
解题思路:
逐行进行;
第i行的元素,有两类,包括z字上下边的元素,和中间斜边元素。
而且,只有第一行和最后一行没有斜边上的元素;其余的都是一个上下边元素,一个斜边元素交替。
对于上下边的元素在s中的位置,只需要从i开始,逐次加2*nRows-2即可。
对于斜边的元素在s中的位置,只需要从当前上下边元素开始,加上2*nRows-2,此时是下一个上下边元素在s中的位置,再减去2*i即为斜边元素在s中的位置。
如今,我们已经知道了如何求各个元素在s中的位置。
我们只需要上下边斜边交替进行插入即可。
代码:
class Solution { public: string convert(string s, int numRows) { if(numRows <= 1) return s; string res = ""; int size = 2*numRows - 2; for(int i=0;i<numRows;i++){ for(int j=i;j<s.size();j+=size){ res += s[j]; int temp = j + size - 2*i; if(i!=0 && i!=numRows-1 && temp<s.size()) res += s[temp]; } } return res; } };