演算法學習: Z 字形變換(c++)leetcode 6
阿新 • • 發佈:2019-01-04
leetcode 6: Z 字形變換
將一個給定字串根據給定的行數,以從上往下、從左到右進行 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
根據官方給出的題解有如下思路:

1.這裡做一個min運算的目的是為了不產生空串,因為在最後一步
遍歷rows時,如果這裡不做判讀都用numRows的值,
在輸入 “LA” 4 這樣的資料時會產生空行
2.如下演算法是,goingDown 實現一個遊標,來回掃動用以表示當“Z”型資料目前是從下往上排列,還是從上往下
class Solution { public: string convert(string s, int numRows) { if (numRows == 1) return s; //這裡做一個min運算的目的是為了不產生空串,因為在最後一步 //遍歷rows時,如果這裡不做判讀都用numRows的值, //在輸入 “LA” 4 這樣的資料時會產生空行 vector<string> rows(min(numRows, int(s.size()))); int curRow = 0; bool goingDown = false; for (char c : s) { rows[curRow] += c; if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown; curRow += goingDown ? 1 : -1; } string ret; for (string row : rows) ret += row; return ret; } };