你須要的LeeCode題No.06——「Z字形變換」_一點課堂(多岸學院)

Z字形變換

題目:Z 字形變換java

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

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

L   C   I   R
    E T O E S I I G
    E   D   H   N

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

請你實現這個將字符串進行指定行數變換的函數:string convert(string s, int numRows);app

示例 1:函數

  • 輸入: s = "LEETCODEISHIRING", numRows = 3
  • 輸出: "LCIRETOESIIGEDHN"

示例 2:學習

  • 輸入: 輸入: s = "LEETCODEISHIRING", numRows = 4
  • 輸出: "LDREOEIIECIHNTSG"
  • 解釋:
L     D     R
    E   O E   I I
    E C   I H   N
    T     S     G

解析

這個題目只須要找好規律,就能夠很快解決了。若是記 m=numRows-1,從縱向來看,第一列對應原串的下標就是 0, 1, 2,..., m,例如示例2的LEET四個字符對應的下標就是0, 1, 2, 3。以後的斜線上字符的下標爲 m+1, m+2,..., 2m,例如示例2的COD下標就是4, 5, 6。從橫向來看,第一行包含0, 2m, 4m,...等元素,最後一行包含m, 3m, 5m,...等元素,而其他行例如第二行則還包含一個2m-1, 4m-1,...的值。ui

掌握了以上規律,咱們就能夠快速解決此問題,參考代碼以下:code

public String convert(String s, int numRows) {
    int len = s.length();
    if (len == 0 || numRows < 2)
        return s;
    int m = numRows - 1;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j < len + m; j += 2 * m) {
            if (i != 0 && i != m) {
                if (j >= i && j - i < len) {
                    sb.append(s.charAt(j - i));
                }
            }
            if (j + i < len) {
                sb.append(s.charAt(j + i));
            }
        }
    }

    return sb.toString();
}

總結

LeetCode上還有相似於此題的簡單題目,接下來的幾個題也是對細緻的考察,這裏就略過了,感興趣的話能夠到個人github上查看代碼。接下來的題目較爲有挑戰性,咱們一塊兒來試試吧。blog

下題預告

題目:正則表達式匹配

描述:給定一個字符串 (s) 和一個字符模式 (p)。實現支持 '.' 和 '*' 的正則表達式匹配。

  • '.' 匹配任意單個字符。
  • '*' 匹配零個或多個前面的元素。

匹配應該覆蓋整個字符串 (s) ,而不是部分字符串。

說明:

  • s 可能爲空,且只包含從 a-z 的小寫字母。
  • p 可能爲空,且只包含從 a-z 的小寫字母,以及字符 . 和 *。

示例 1:

  • 輸入: s = "aa", p = "a"
  • 輸出: false
  • 解釋: "a" 沒法匹配 "aa" 整個字符串。

示例 2:

  • 輸入: s = "aa", p = "a*"
  • 輸出: true
  • 解釋: '*' 表明可匹配零個或多個前面的元素, 便可以匹配 'a' 。所以, 重複 'a' 一次, 字符串可變爲 "aa"。

示例 3:

  • 輸入: s = "ab", p = ".*"
  • 輸出: true
  • 解釋: ".* " 表示可匹配零個或多個( '*' )任意字符('.')。

示例 4:

  • 輸入: s = "aab", p = "cab"
  • 輸出: true
  • 解釋: 'c' 能夠不被重複, 'a' 能夠被重複一次。所以能夠匹配字符串 "aab"。

示例 5:

  • 輸入: s = "mississippi", p = "misisp*."
  • 輸出: false

相關源碼請加QQ獲取。


【感謝您能看完,若是可以幫到您,麻煩點個贊~】

更多經驗技術歡迎前來共同窗習交流: 一點課堂-爲夢想而奮鬥的在線學習平臺 http://www.yidiankt.com/

![關注公衆號,回覆「1」免費領取-【java核心知識點】] file

QQ討論羣:616683098

QQ:3184402434

想要深刻學習的同窗們能夠加我QQ一塊兒學習討論~還有全套資源分享,經驗探討,等你哦! 在這裏插入圖片描述

相關文章
相關標籤/搜索