LEETCODE專題
6. ZigZag Conversion
照例先上個題目要求:
這裏首先講一下什麼叫“ZigZag Pattern”。
簡單來說就是兩條平行線之間的一條有折角的曲線,每個折角度數相同並且角的頂點均在兩條平行線上。而適用到這道題上,其實也就是“N”上下顛倒的形狀。
實現的主要問題只有一個:如何找到每一行字符下標的變換規律
這裏要多舉點例子仔細觀察一下。譬如題目給的例子,改一下行數就會發現其實字符下標是有周期的,而這個週期就是2 *(numRows - 1)。
輸入: "PAYPALISHIRING" 3
P A H N
APLSIIG
Y I R
輸出: "PAHNAPLSIIGYIR"
輸入:"PAYPALISHIRING" 4
P I N
A LS IG
YA HR
P I
輸出: "PINALSIGYAHRPI"
輸入: "PAYPALISHIRING" 5
P H
A SI
Y I R
PL IG
A N
輸出: "PHASIYIRPLIGAN"
有好幾行在一個週期內除了週期對應的字符外,還有其它的字符。這個字符在某些人的解法裏被稱爲“partner”,找到了該字符與其“partner”的下標變換規律之後,其實也就找到了改行內所有字符下標的變換規律,自然也就能解決這一行的所有字符輸出了。但是,第一行和最後一行的字符是沒有“partner”的,這點要尤其注意!
最後就是一個細節問題,警惕輸入只有一個字符或者輸入的行數只有1
下面直接上code:
class Solution {
public:
string convert(string s, int numRows) {
int i, index, change;
string result;
for (i = 1; i < numRows; i++) {
index = i - 1;
change = 2 * (numRows - i);
while (index < s.length()) {
result += s[index];
index += change;
change = i == 1 ? 2 * (numRows - i) :
2 * (numRows - 1) - change;
}
}
// Now i == numRows
index = i - 1;
change = numRows == 1 ? 1 : 2 * (numRows - 1);
while (index < s.length()) {
result += s[index];
index += change;
}
return result;
}
};
時間複雜度:O(n)