菜鸡/咸鱼的自我修养之认真记录
第一种解法:
缺点:用时较多
根据题目分析,Z字可拆分成一个类似V型的结构
示例:"L E E T C O D E I S H I R I N G" numRows=4
行数:"1 2 3 4 3 2 1 2 3 4 3 2 1 2 3 4" (在Z字变换中对应的行数)
所以,我根据numRows构造index列表,将index与字符串序列一一对应 ,通过乘操作得到num_s
第一行:在前面 n 个元素 找出num_s 值为1 对应的下标;newStr存储s中对应下标的字符
其他行:可类比
class Solution:
def convert(self, s: str, numRows: int) -> str:
n = len(s)
if numRows==1:
return s
else:
part = 2 * numRows - 2
#至少需要m个Z字形
m = (n // part) + 1
index = [0] * part
for i in range(part):
if i < numRows - 1:
index[i] = i
else:
index[i] = 2 * (numRows - 1) - i
#虽然num_s的长度大于n 我们只取前n个
num_s = index * m
z = 0
newStr = ['']*n
for k in range(numRows):
for j in range(n):
if num_s[j] == k:
newStr[z] = s[j]
z += 1
#将列表转换为字符串
s1 = ''.join(newStr)
return s1
第二种解法:
CSDN 上看到的解法:
以“LEETCODERFUNORAM” 为例, 右侧的数字为字符在字符串序列里对应的下标
可以看出:
第一行和最后一行: 下标差均为(2*numRows-2)
中间行:E1 E7 R13下标差均为(2*numRows-2)
E1 和 O5 下标差为(2*numRows-2 - 2*行数)
L 0 | D 6 | O 12 | ||||
E 1 | O 5 | E 7 | N 11 | R 13 | ||
E 2 | C 4 | R 8 | U 10 | A 14 | ||
T 3 | F 9 | M 15 |
class Solution:
def convert(self, s: str, numRows: int) -> str:
n = len(s)
if n==1 or n==0 or numRows==1:
return s
else:
part = 2 * numRows - 2
newStr = ""
for i in range(numRows):
for j in range(i, n, part): #j的取值从i开始,到字符串长度截止,步长为part
newStr += s[j]
#如果不是第一行或者最后一行,元素之间的关系
if i!=0 and i!=numRows-1 and part-2*i+j<n:
newStr += s[part-2*i+j]
return newStr