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)