1. 程式人生 > >leetcode 6: Z字形變換

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 }