LeetCode 6 — ZigZag Conversion(Z字形變換)

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);

Example 1:
Input: s = “PAYPALISHIRING”, numRows = 3
Output: “PAHNAPLSIIGYIR”
Example 2:
Input: s = “PAYPALISHIRING”, numRows = 4
Output: “PINALSIGYAHRPI”
Explanation:
P I N
A L S I G
Y A H R
P I

翻譯
將字符串 “PAYPALISHIRING” 以Z字形排列成給定的行數:
P A H N
A P L S I I G
Y I R
之後從左往右,逐行讀取字符:“PAHNAPLSIIGYIR”
實現一個將字符串進行指定行數變換的函數:
string convert(string s, int numRows);

分析
首位兩行間隔固定,中間行間隔線性變化,分類討論即可。

c++實現

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1)return s;
        int len = s.size(), k = 0, interval = (numRows<<1)-2;
        string res(len, ' ');
        for(int j = 0; j < len ; j += interval)//處理第一行
            res[k++] = s[j];
        for(int i = 1; i < numRows-1; i++)//處理中間行
        {
            int inter = (i<<1);
            for(int j = i; j < len; j += inter)
            {
                res[k++] = s[j];
                inter = interval - inter;
            }
        }
        for(int j = numRows-1; j < len ; j += interval)//處理最後一行
            res[k++] = s[j];
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章