1. 程式人生 > 實用技巧 >6. Z 字形變換 ZigZag Conversion

6. Z 字形變換 ZigZag Conversion

The string"PAYPALISHIRING"is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H N
A P L S I I G
Y I R

And then read line by line:"PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

方法一:

從左向右迭代字串。

public String convert(String s, int numsRow){
        if(numsRow == 1) return s;
        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numsRow, s.length()); i++){
            rows.add(new StringBuilder());
        }
        
boolean goingDown = false; int curRow = 0; for (Character c : s.toCharArray()){ rows.get(curRow).append(c); if(curRow == 0 || curRow == numsRow - 1) goingDown = !goingDown; curRow += goingDown? 1 : -1; } StringBuilder ans = new StringBuilder();
for(StringBuilder row: rows) ans.append(row); return ans.toString(); }

時間複雜度O(n)

方法二:

字元從第一行到最後一行再回到第一行的週期為2*numRows2

第一行字元位於原來的k  (2*numRows−2)

最後一行字元位於原來k(2*numRows2)+numRows1

中間第i行字元位於原來的k(2*numRows2)+i 和(k+1)(2*numRows2)i

public String convert(String s, int numRows){
        if (numRows == 1){
            return s;
        }
        StringBuilder ans  = new StringBuilder();
        int n = s.length();
        int cycleLen = 2 * numRows -2;
        for ( int i = 0; i < numRows; i++){
            for (int j = 0; j + i < s.length(); j += cycleLen){
                ans.append( s.charAt(j + i));
                if( i !=0 && i != numRows - 1 && j + cycleLen -i < n)
                    ans.append(s.charAt(j + cycleLen - i));
            }
        }
        return ans.toString();
    }

時間複雜度O(n)

參考連結:

https://leetcode.com/problems/zigzag-conversion

https://leetcode-cn.com/problems/zigzag-conversion