LeetCode6: ZigZag Conversion(Z字形變換)
LeetCode:https://leetcode-cn.com/problems/zigzag-conversion/
LeetCodeCn:https://leetcode-cn.com/problems/zigzag-conversion/
題目描述
將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字串為 "LEETCODEISHIRING" 行數為 3 時,排列如下:
L C I R
E T O E S I I G
E D H N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"LCIRETOESIIGEDHN"。
示例
-
示例 1:
- 輸入: s = "LEETCODEISHIRING", numRows = 3
- 輸出: "LCIRETOESIIGEDHN"
-
示例 2:
- 輸入: s = "LEETCODEISHIRING", numRows = 4
- 輸出: "LDREOEIIECIHNTSG"
解題-歸納法
主要思路是遍歷一次字串,通過歸納得到的關係直接生成每行的內容.
圖解相關思路
下圖是一個長度為23的字串在行數為5的情況下其元素對應的情況
我們可以將其分割為三個部分,setp(分割的步長) = 2 * (numRows - 1),至此我們還可以通過用length(s字串的長度)/step來得到此時我們分割了幾部分
我們針對第一部分繼續分割,我們可以看到第一行和最後一行都是隻有一個元素,和中間有兩個元素的行中,兩個元素之和步長.
不過當我們歸納下一組時,我們發現非首位行中兩個元素和並不簡單的是步長,因為再非首組中,其資料經過step長度的平移,歸納後我們可以發現,非首位行的第二個元素(15)其值等於下一組首位(16)減去當前所在行數(1)
那麼最後如何實現就十分明瞭了,不過記得在裡層迴圈的時候,每次增加的長度為step.在非首尾行中,第二個元素需要驗證其是否小於length
程式碼實現
public String convert(String s, int numRows) {
if (numRows == 1){
return s;
}
int length = s.length();
StringBuffer result = new StringBuffer();
int step = 2 * (numRows - 1);
for (int i = 0; i < numRows; i++) {
for (int j = 0; j + i < length; j += step) {
result.append(s.charAt(j + i));
if (i != 0 && i != numRows - 1 && j + step - i < length){
result.append(s.charAt(j + step - i ));
}
}
}
return result.toString();
}
複製程式碼
相關程式碼歡迎大家關注並提出改進的建議