【LeetCode 中等題】4-Z字形變換
阿新 • • 發佈:2018-11-27
宣告:
今天是中等題第4道題。將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:將一個給定字串根據給定的行數,以從上往下、從左到右進行 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" 解釋:L C I R E T O E S I I G E D H N示例 2:
輸入: s = "LEETCODEISHIRING", numRows = 4 輸出: "LDREOEIIECIHNTSG" 解釋: L D R E O E I I E C I H N T S G
解法1。觀察可以發現一些規律,相鄰兩列之間的差=2*numRows-2,再看看每行的元素下邊index和行數的關係,總結如下:
- 首尾兩行:只有(lens+numRows-2)/2*(n-2)個元素
- 中間的下標和行數i及第j位的關係是:j-2*i+k
執行用時: 120 ms, 在ZigZag Conversion的Python3提交中擊敗了82.53% 的使用者
class Solution: def convert(self, s, numRows): """ :type s: str :type numRows: int :rtype: str """ k = 2*numRows - 2 if not s or numRows == 0 or numRows == 1: return s lens = len(s) res = '' for i in range(numRows): for j in range(i,lens,k): res += s[j] if i != 0 and i != numRows and j-2*i+k < lens: res += s[j-2*i+k] return res
結尾
解法1:https://blog.csdn.net/chenhua1125/article/details/80412550