leetcode 6: Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

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

解析:首先将例子以下标的形式展现如下
0     6       12
1   5 7    11 13
2 4   8 10
3     9
这样一来就可以很容易看出每一行相邻两元素的间距
6 0
4 2
2 4
0 6
至此规律已经很明显了, 这里需要注意第一行跟最后一行中表面上看貌似所有元素间距就只有6, 实际上我们可以假设有一个隐藏元素, 其与前一元素间距0, 也就是同一元素, 这样规律才更清晰
 1 string convert(string s, int numRows) {
 2         if(numRows == 1)
 3             return s;
 4         char *res = new char[s.size()+1];
 5         res[s.size()] = '\0';
 6         int j = 0;
 7         int sp = (numRows << 1 ) - 2;
 8         for(int i = 0; i < numRows; ++i)
 9         {
10             int p = i;
11             bool flag = true;
12             while(p < s.size() && j < s.size())
13             {
14                 res[j++] = s[p];
15                 int csp = flag? sp - (i << 1) : (i << 1);
16                 if(0 == csp)
17                 {
18                     j--;
19                 }
20                 p += csp;
21                 flag = !flag;
22             }
23         }
24         return res;
25 }

猜你喜欢

转载自www.cnblogs.com/bzaq/p/9956653.html