ZigZag Conversion
Solution 1
这道题应该就是一个比较裸的模拟题,一开始还尝试使用固定的公式计算各个字符所属的行,实际上这么做会占用同样大的空间,但是变得复杂了,这个只需要不断地遍历每一个字符并且不断地维护一个状态变量即可。在这个题中,状态变量在1
和num_rows
之间迭荡,先增大到大边界,在减小到小边界,记录每一个字符的所属行,然后再逐行输出即可。
取决于个人维护的实现不同,本人的实现方法需要单独处理仅为1行的情形。
- 时间复杂度: O ( n ) O(n) O(n), n n n为输入字符串的长度
- 空间复杂度:
O
(
n
)
O(n)
O(n),
n
n
n为输入字符串的长度,实际上初始化数组为
num_rows
行,实际占用为数组长度
class Solution {
public:
string convert(string s, int numRows) {
vector <string> rowStrs(numRows);
if (numRows == 1) {
return s;
}
int direction = 1;
int row = 1;
for (char c: s) {
rowStrs[row - 1] += c;
if ((row == 1 && direction == -1) || (row == numRows && direction == 1)) {
direction *= -1;
}
row += direction;
}
string ans;
for(string str: rowStrs) {
ans += str;
}
return ans;
}
};
Solution 2
Solution 1的python实现
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
rowStrs = [""] * numRows
direction = -1
row = 1
for c in s:
rowStrs[row - 1] += c
if (row == 1 and direction == -1) or (row == numRows and direction == 1):
direction *= -1
row += direction
ans = ""
for sstr in rowStrs:
ans += sstr
return ans