来源:
https://leetcode-cn.com/problems/zigzag-conversion/
观察(numRows=3):
- Most importantly, 寻找idx, numRows, row的关系,这下你应该知道自己下次该如何解决这样的问题
- row = idx % (2 * numRows - 2), 你会发现除数正好是z字形的一个小周期,如上图所示
- row > numRows - 1 中,numRows 是从0开始,其中的row代表元素的下标,当其>=3 时开始适用 ===>例如T 是如何进入第二分队的
- row = 2 * numRows - 2 - row 相当于一个周期减去row,就可以知道当前字符位于哪一个分队
- len(result) < row + 1 以空字符串创建三大分队
- 观察左下角的元素的row,借助于模运算,可以很快地将元素归队===>例如C,I,R 通过mod 4,一下子知道它们位于第一队
- 很巧妙的是,处理中间一个元素一列的情况
实现:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
result = list()
for idx, ch in enumerate(s):
row = 0
if numRows != 1:
row = idx % (2 * numRows - 2)
if row > numRows - 1:
row = 2 * numRows - 2 - row
if len(result) < row + 1:
result.append("")
result[row] = result[row] + ch # 根据行数定位元素
return "".join(result)