1. 程式人生 > >你需要的LeeCode題No.06——“Z字形變換”_一點課堂(多岸學院)

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

Z字形變換

題目:Z 字形變換

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

比如輸入字串為 "LEETCODEISHIRING" 行數為 3 時,排列如下:

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

之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"LCIRETOESIIGEDHN"。

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

示例 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,...的值。

掌握了以上規律,我們就可以快速解決此問題,參考程式碼如下:

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上檢視程式碼。接下來的題目較為有挑戰性,我們一起來試試吧。

下題預告

題目:正則表示式匹配

描述:給定一個字串 (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一起學習討論~還有全套資源分享,經驗探討,等你哦! 在這裡   
 
 </div> 
 <div class=

相關推薦

需要LeeCodeNo.06——“Z字形變換_一點課堂學院

Z字形變換 題目:Z 字形變換 描述:將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字

LeetCode演算法6:Z 字形變換解析

將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下: L C I R E T O E S I I G E D H N 之後,你的輸出需要從左往右逐行讀取,

leetcode演算法6:Z 字形變換

題目:將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 "LEETCODEISHIRING" 行數為 3 時,排列如下: L C I R E T O E S I I G E D H N 之後,你

【LeetCode 中等】4-Z字形變換

宣告: 今天是中等題第4道題。將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )

LeetCode-06 Z字形變換

C++版本 class Solution { public: string convert(string s, int numRows) { if (numRows <= 1) return s; string res = ""; int

leetcode刷6<z字形變換>

image 復雜 style clas round ring 變換 函數 mage 將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字符串為 "LEETCODEISHIRING" 行數為 3 時,排列如下: L C I R

[ccf/csp]201412-2 Z字形掃描

試題編號: 201412-2 試題名稱: Z字形掃描 時間限制: 2.0s 記憶體限制: 256.0MB 問題描述: 問題描述   在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n

Z字形變換

ext row tco extend ret == 好的 main 給定 將字符串 "PAYPALISHIRING" 以 Z 字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字符:"PAHNAPLS

【LeetCode】6. Z字形變換

題目連結:https://leetcode-cn.com/problems/zigzag-conversion/description/ 題目描述 將字串 “PAYPALISHIRING” 以Z字形排列成給定的行數: P A H N A P L S I I G Y

leetcode 6: Z字形變換

將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個將字串進行指定行數變換的函式: string convert(s

LeetCode之6. Z 字形變換

LeetCode之6. Z 字形變換 將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下: 之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:“LCIRET

Leetcode 6. Z字形變換 C++

題目描述 思路 一下做法是一種比較粗暴的做法。通過定義一個二維陣列,記錄Z型變換後的結果,之後再將結果讀出。在程式中,只需要定義一個變數(ln)用於記錄是哪一行該插入。如果到達最上端,則下一次就開始向下一行插入。如果到達最下端,那麼下一次就開始向上一行插入。 解答 cl

【LeetCode】6.ZigZag Conversion Z字形變換

示例1: Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR" Explanation: P A H N A P L S I I G Y I R 示例2: Input: s =

LeetCode-6. Z 字形變換

題目地址:https://leetcode-cn.com/problems/zigzag-conversion/ 題意:字面意思 思路:模擬一下就好了 AC程式碼: class Solution { public: string convert(string s, int n

6. Z字形變換leetcode)

將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數: P    A     H    N A P L S  I  I  G Y     I     R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個將字串進行指定行數變換的函式:

LeetCode 6. Z字形變換

題目描述: 將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個將字串進行指定行數變換的函式: st

006——Z字形變換

參考答案: #include<iostream> #include<vector> #include<string> usingnamespacestd; stringconvert(strings,intnRows) { //如果nR

[leetcode]Z字形變換Zigzag Conversion

Z字形變換(Zigzag Conversion) 將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個

LeetCode6—— Z字形變換

題目內容 描述 將字串 "PAYPALISHIRING"以Z字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個將字串進行指定行數變換的函式: s

Leetcode Z字形變換

題目描述: 將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數: P A H N A P L S I I G Y I R 之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR" 實現一個將字串進行指定行數變換的函式: st