熱門文章

2026年7月29日 星期三

LeetCode 解題筆記:6. Zigzag Conversion

作者:王一哲
日期:2026年7月29日


LeetCode 題目連結:6. Zigzag Conversion

解題想法


中等難度題。題目給一個字串 $s$、列數 $numRows$,要找出共有 $numRows$ 列的之字形排列字串。我先用一個 $numRows$ 列的陣列儲存每一列的字串內容,最後再把陣列內容接成一個很長的字串後回傳,主要的工作是在計算目前這個字元應該填在陣列中的哪一列。

Python 程式碼


Runtime: 7 ms, beats 84.25%. Memory: 19.24 MB, beats 79.60%.
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        # 特例,只有一列,直接輸出 s
        if numRows == 1: return s
        # 一般狀況
        n = len(s)  # 長度
        grid = [""] * numRows  # 儲存答案用的串列
        r, d = 0, 0  # 目前所在的列,方向
        for ch in s:  # 依序讀取字元
            grid[r] += ch  # 加入字元 ch
            if d == 0:  # 向下移動
                r += 1
                if r == numRows - 1: d = 1  # 走到最下方,改成向上走
            else:  # 向上移動
                r -= 1
                if r == 0: d = 0  # 走到最上方,改成向下走
        # 從 grid 讀取字串,組合成字串 t 再回傳
        return "".join(grid)


C++ 程式碼


Runtime: 4 ms, beats 62.13%. Memory: 14.34 MB, beats 19.58%.
class Solution {
public:
    string convert(string s, int numRows) {
        // 特例,只有一列,直接輸出 s
        if (numRows == 1) return s;
        // 一般狀況
        int n = (int)s.size();  // 長度
        vector<string> grid (numRows);  // 儲存答案用的陣列
        int r = 0, d = 0;  // 目前所在的列,方向
        for(char ch : s) {  // 依序讀取字元
            grid[r] += ch;  // 加入字元 ch
            if (d == 0) {  // 向下移動
                r++;
                if (r == numRows - 1) d = 1;  // 走到最下方,改成向上走
            } else {  // 向上移動
                r--;
                if (r == 0) d = 0;  // 走到最上方,改成向下走
            }
        }
        // 從 grid 讀取字串,組合成字串 t 再回傳
        string t;
        for(auto g : grid) t += g;
        return t;
    }
};


沒有留言:

張貼留言