6. Z 字形变换
题目链接
这道题直接简单模拟,先放进一个二维数组然后按行访问数组即可。
官方题解:用的按行排序和按行访问
由于官方没有python版本,我这里给出官方题解的python版本在最后
简单模拟方法:
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1) return s;
vector<vector<char>> v(numRows);
int j = 0, i = 0;
int flag = 1;//flag控制方向
while(i < s.size())
{
v[j].push_back(s[i]);
i++;
if(j >= numRows-1)//到达边界改变方向
flag = 0;
if(j <= 0) flag = 1;
if(flag == 1)
j++;//向下则加
else j--; //向上则减
}
string ans = "";
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < v[i].size(); j++)
{
ans += v[i][j];//按行访问二维数组
}
}
return ans;
}
};
python3按行排序:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
list1 = ['']*numRows
curRow = 0
goingDown = False
for c in s:
list1[curRow] += c
if curRow == 0 or curRow == numRows-1:
goingDown = not goingDown
curRow += 1 if goingDown else -1
ans = ''
for row in list1:
ans += row
return ans
python3按行访问:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
ret = ''
n = len(s)
cycleLen = 2*numRows - 2
for i in range(0, numRows):
for j in range(0, n-i, cycleLen):
ret += s[j+i]
if i != 0 and i != numRows - 1 and j + cycleLen - i < n:
ret += s[j + cycleLen - i]
return ret
如果对你有帮助的话,请点个赞哦!