1. 程式人生 > >LeetCode 6. Z字形變換

LeetCode 6. Z字形變換

題目描述:

將字串 "PAYPALISHIRING" 以Z字形排列成給定的行數:

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

之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR"

實現一個將字串進行指定行數變換的函式:

string convert(string s, int numRows);

示例 1:

輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"

示例 2:

輸入: s = "PAYPALISHIRING", numRows = 4
輸出: "PINALSIGYAHRPI"
解釋:
P I N A L S I G Y A H R P I

程式碼實現:

//逐行訪問
class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1)
            return s;
        StringBuilder ret = new StringBuilder();
        int n = s.length();
        int cycleLen = 2 * numRows - 2;
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j + i < n; j += cycleLen) {                       //同行            
                                                                         整週期的字元
                ret.append(s.charAt(j + i));
                if (i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
                    ret.append(s.charAt(j + cycleLen - i));             //同行兩個周    
                                期中間的字元,由於第一行和最後一行不存在這樣的字元,所以要排除
                }
            }
        }
        return ret.toString();
    }
}