LeetCode6: ZigZag Conversion(Z字形變換)

gengzhibo發表於2019-01-12

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來得到此時我們分割了幾部分

處理1

我們針對第一部分繼續分割,我們可以看到第一行和最後一行都是隻有一個元素,和中間有兩個元素的行中,兩個元素之和步長.

處理2

不過當我們歸納下一組時,我們發現非首位行中兩個元素和並不簡單的是步長,因為再非首組中,其資料經過step長度的平移,歸納後我們可以發現,非首位行的第二個元素(15)其值等於下一組首位(16)減去當前所在行數(1)

處理3

那麼最後如何實現就十分明瞭了,不過記得在裡層迴圈的時候,每次增加的長度為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();

  }
複製程式碼

相關程式碼歡迎大家關注並提出改進的建議

相關文章