題目描述
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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
我的思路
- 做完看了下其他人的答案,感覺大部分人都把這道題搞得有點複雜了。
- 這道題可以這麼考慮:對於輸入的字符串s,其下標 i / (numRows-1) 如果爲偶數或零,則代表該下標代表的字符在Z字型中屬於豎列。如果 i / (numRows-1) 如果爲奇數,則代表該下標代表的字符在Z字型中屬於斜列(Z字型的中間傾斜部分)。
- 如果當前字符屬於豎列,則按照正序依次保存在字符串數組 temp 中(
temp[remain].push_back(s[i])
),如果屬於斜列,則逆序保存(temp[numRows-remain-1].push_back(s[i])
)。 - 最後將 temp 數組依次按序輸出就是最終答案。
class Solution {
public:
string convert(string s, int numRows) {
vector<string> temp(numRows);
string res;
if(s.empty() || numRows < 1) return res;
if(numRows == 1) return s;
for(int i = 0; i < s.size(); i++){
int ans = i / (numRows-1);
int remain = i % (numRows-1);
if(ans % 2 == 0){ //結果爲偶數或0
temp[remain].push_back(s[i]); //按餘數正序保存
}
if(ans % 2 != 0){ //結果爲奇數
temp[numRows-remain-1].push_back(s[i]); //按餘數倒序保存
}
}
for(int i = 0; i < temp.size(); i++){
res += temp[i];
}
return res;
}
};