leetcode0006

題目描述:

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zigzag-conversion
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

1.將字符先從上至下,再從下至上變形,再進行輸出
2.可以設置標誌位,從上至下標誌位不斷增加,當標誌位到達最大行數時停止向下,並向上依次遞減至第0行,反覆迭代次過程直到所有字符輸出。

題解

    public String convert(String s, int numRows) {

        if(numRows==1) return s;

        List<StringBuilder> rowList= new ArrayList<>();
        for(int i=0;i<Math.max(s.length(),numRows);i++) rowList.add(new StringBuilder());
        /**
         * 根據行數生成多個字符串序列
         * 字符串序列的數目由行數和原始字符串長度共同決定。
         * 1.如果字符串長度小於行數,那麼生成字符串長度的字符序列,這是因爲
         * 字符串長度不夠行數,每行將只有一個字符,那麼生成字符串長度的字符串
         * 序列就可以了。
         * 2.字符串長度大於行數,代表每行大於1個字符,這時候按照行數生成字符
         * 串序列。
         */

        int i=0;
        int flag=-1;

        for(char c:s.toCharArray())
        {
            rowList.get(i).append(c);
            if(i==0||numRows-i==1) flag=-flag;
            /**
             * 當行數等於0或最後一行時,我們需要改變行進方向
             * 這個思路很精妙,考慮記住
             */
            i+=flag;
        }

        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rowList) res.append(row);
        return res.toString();
    }

感悟

1.行進方向用flag標誌位表示,這非常精妙。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章