歡迎訪問個人我的網站java
LeetCode:https://leetcode-cn.com/problems/zigzag-conversion/git
LeetCodeCn:https://leetcode-cn.com/problems/zigzag-conversion/github
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。app
好比輸入字符串爲 "LEETCODEISHIRING" 行數爲 3 時,排列以下:網站
L C I Rspa
E T O E S I I G3d
E D H Ncode
以後,你的輸出須要從左往右逐行讀取,產生出一個新的字符串,好比:"LCIRETOESIIGEDHN"。cdn
示例 1:blog
示例 2:
主要思路是遍歷一次字符串,經過概括獲得的關係直接生成每行的內容.
下圖是一個長度爲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();
}
複製代碼
相關代碼歡迎你們關注並提出改進的建議