[力扣][精选]第6题-Z字形变换
答案:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows==1:#单行的情况单独判断,提高运行速度
return s
i, ele, mid, ans = 0, [], [], []
while i < len(s):#切分字符串,将N字形的列字符与中间字符分开储存
ele.append(s[i:i + numRows]) # 存储列字符,到达字符串末尾自动停止
#存储中间字符并调换顺序(将后一个字符调转到前面)
mid.append((s[i + numRows:i + 2 * numRows - 2])[::-1])#添加至中间字符串数组
i = i + 2 * numRows - 2 #索引到下一列(如4行则加6至下一列,跳转同时跳过中间元素直接指向下一列的第一个元素)
for i in range(numRows):
if 0 < i < numRows - 1: # 判断是否为中间元素
for o in range(len(ele)):
try:#简单的异常处理,跳过索引出错(通常是因为数组内字符串的字符不够了,这种情况直接跳到下一行执行就可以)
ans.append(ele[o][i])
if len(mid[o]) < numRows - 2:
mid[o] = " " + mid[o]#防止中间元素的顺序被错误调换,在字符前加入空格作为无效符号
ans.append(mid[o][i - 1])#添加中间元素
except IndexError:
continue
else:
for j in ele:#添加列元素
if len(j) > i:#只有当列元素的长度满足要求时才会添加
ans.append(j[i])
return "".join(ans).replace(" ", '')
本题的思路包括两个步骤:切分字符串+重塑字符串
本题的核心要点:
- 切分字符串时,列元素的顺序无需调换,而中间元素的顺序需要调换。在使用中间元素字符串时,如果中间元素字符串的长度少于中间元素字符串,则在该字符串前加入空格符号,以将出错的顺序调换回来
- 异常处理的使用。在重塑字符串时,如果索引超出界限,那么一般是字符串的长度不足导致的,此时不需要特殊操作,判断异常后直接继续执行即可
- 切分字符串的索引需要适当的计算经验。以切分为4行为例,将字符串以6个字符分组,同个组内的前4个字符为列元素,后两个为中间元素,分别存放至数组
本题的答案虽然写的比较糟糕,但也算是完成了任务,速度与内存消耗皆不算高。实际上题目本身不难,不需要高超的技巧,就是费时比较多。
1157 / 1157 个通过测试用例
状态:通过
执行用时: 48 ms
内存消耗: 15.2 MB