LeetCode6: ZigZag Conversion(Z字形變換)

LeetCode6: ZigZag Conversion(Z字形變換)

歡迎訪問個人我的網站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

    • 輸入: 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();

  }
複製代碼

相關代碼歡迎你們關注並提出改進的建議

相關文章
相關標籤/搜索