【一塊兒刷LeetCode】Z 字形變換

題目描述

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。java

好比輸入字符串爲 "LEETCODEISHIRING" 行數爲 3 時,排列以下:web


以後,你的輸出須要從左往右逐行讀取,產生出一個新的字符串,好比:"LCIRETOESIIGEDHN"。

請你實現這個將字符串進行指定行數變換的函數:微信

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 == 1return 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)

  • 寫做不易,轉載請註明出處,喜歡的小夥伴能夠關注公衆號查看更多喜歡的文章。
  • 聯繫方式:4272231@163.com
  • QQ:95472323
  • 微信:ffj2000
相關文章
相關標籤/搜索