將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。java
好比輸入字符串爲 "LEETCODEISHIRING" 行數爲 3 時,排列以下:web
請你實現這個將字符串進行指定行數變換的函數:微信
string convert(string s, int numRows);app
示例1:函數
輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"ui
示例2:spa
輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"code解釋:orm
根據題意描述,按照從上到下,從左到右逐個讀取Z字形圖案的順序訪問字符串。blog
首先訪問第0行中的全部字符串,接着訪問第1行,而後第2行…….
對於全部整數n,
行 0 中的字符索引位置:n * (2 * numRows - 2);
行 i 中的字符索引位置:n * (2 * numRows - 2) - i 和 (n + 1) * (2 * numRows - 2) - i;
行 numRows - 1 中的字符索引位置:n * (2 * numRows - 2) + numRows - 1;
注意:下標n不能超過len(s)-1;
public String convert(String s, int numRows) {
if (s == null || s.length() == 0 || numRows == 1) return s;
StringBuilder sb = new StringBuilder();
int n = s.length();
int cycleLen = 2 * numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j + i < n; j += cycleLen) {
sb.append(s.charAt(j + i));
if (i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
sb.append(s.charAt(j + cycleLen - i));
}
}
}
return sb.toString();
}
- 時間複雜度:O(n), n==len(s)。每一個索引都被訪問一次。
- 空間複雜度:O(n)