您好,登錄后才能下訂單哦!
這篇“C++中的Z字形變換問題怎么解決”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++中的Z字形變換問題怎么解決”文章吧。
將一個給定字符串 s 根據(jù)給定的行數(shù) numRows ,以從上往下、從左到右進(jìn)行 Z 字形排列。
比如輸入字符串為 “PAYPALISHIRING” 行數(shù)為 3 時,排列如下:
P A H N A P L S I I G Y I R
之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個新的字符串,比如:“PAHNAPLSIIGYIR”。
請你實(shí)現(xiàn)這個將字符串進(jìn)行指定行數(shù)變換的函數(shù):
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
示例3
輸入:s = "A", numRows = 1
輸出:"A"
思路/解法
模擬法,根據(jù)所給條件,線性處理即可(Z字形存在一定規(guī)律,每當(dāng)固定的條件后前進(jìn)方向進(jìn)行轉(zhuǎn)變)。
class Solution { public: string convert(string s, int numRows) { int rows = numRows; int columns = ((s.length() / (2 * rows - 1)) + 1) * rows;//盡可能縮小所使用的空間,這里columns可優(yōu)化,并未精確求解 std::vector<std::vector<char>> arrs(rows, std::vector<char>(columns)); //初始化 for (int i = 0; i < rows; i++) for (int j = 0; j < columns; j++) arrs[i][j] = '0'; int x = 0, y = 0; int index = 0; while (index < s.length()) { if (index < s.length() && x < rows) arrs[x++][y] = s[index++]; if (index < s.length() && x == rows) { //更新x和y y++; x -= 2; while (index < s.length() && x > 0) arrs[x--][y++] = s[index++]; x = 0;//重置x } } std::string res; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { if (arrs[i][j] != '0' && arrs[i][j] != '\0') res.push_back(arrs[i][j]); } } return res; } };
以上就是關(guān)于“C++中的Z字形變換問題怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。