字符串模擬算法題
我們來看一道很有意思的算法題目: 將一個(gè)給定字符串 s 根據(jù)給定的行數(shù) numRows ,以從上往下、從左到右進(jìn)行 Z 字形排列。 比如輸入字符串為 "PAYPALISHIRING" 行數(shù)為 3 時(shí),排列如下: P A H N A P L S I I G Y I R 之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個(gè)新的字符串,比如:"PAHNAPLSIIGYIR"。 請(qǐng)你實(shí)現(xiàn)這個(gè)將字符串進(jìn)行指定行數(shù)變換的函數(shù): string convert(string s, int numRows); 復(fù)制代碼 大家先思考一下,如果是自己來解這道題,會(huì)如何來做?
這是一道字符串模擬題。
題目要求將字符串 s 以 Z 字形排列并返回按行讀取后的字符串。
我們可以創(chuàng)建一個(gè)字符串?dāng)?shù)組,其中每一行都是一個(gè)字符串。接下來,我們可以使用雙重循環(huán)遍歷字符串 s,并將字符添加到對(duì)應(yīng)的行中。
最后,我們將這些字符串按順序拼接起來,以得到按行讀取后的字符串。
代碼實(shí)現(xiàn)如下:
string convert(string s, int numRows) {
? ?if (numRows == 1) return s;
? ?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;
}
這道題是一道非常有趣且有啟發(fā)性的題目,可以幫助我們提高我們的字符串模擬能力。