Descrição do problema: Organize uma sequência de caracteres em um padrão em zigue-zague de cima para baixo e da esquerda para a direita, de acordo com o número especificado de linhas. (String de entrada s e número de linhas numRows, saída em nova ordem)
Por exemplo, quando a sequência de entrada é "LEETCODEISHIRING" e o número de linhas é 3, a organização é a seguinte:
L C I R
E T O E S I I G
E D H N
Método um: encontre a lei
1. Modularidade
Podemos ver pela forma do exemplo acima que, como esses Z se sobrepõem, podemos pensar em "uma vertical" mais "uma menção" como um pequeno módulo, como "LEET" como o primeiro Módulo pequeno, use "CODE" como o segundo módulo pequeno ...
2. Determine o tamanho do módulo
Primeiro, encontre um exemplo mais representativo:
L D R
E O E I I
E C I H N
T S G
Podemos concluir que a "uma vertical" de um módulo pequeno tem sempre mais 2 caracteres do que a "uma menção", e o número de caracteres de "uma vertical" é o número de linhas numRows, portanto, pode-se inferir que o tamanho do módulo pequeno é:
batch_z = 2 * numRows-2
3. Determine o relacionamento de saída Se
você produzir por linha (considere o segundo exemplo como exemplo),
os 0, 1, 2 e 3 elementos da linha 0 possuem 0% 6 = 0, 6% 6 = 0, 12% 6 = 0, 18% 6 = 0
Linha 1, linha 1, 1, 2, 3 elementos possuem 1% 6 = 1,7% 6 = 1,13% 6 = 1,19% 6 = 1
···
A ordem de saída pode ser derivada disso
4. Procedimento
class Solution:
def convert(self, s: str, numRows: int) -> str:
new_s = []
if numRows == 0:
return None
elif numRows == 1:
return s
batch_z = 2*numRows-2 #一条竖边和一条斜边构成一个z
vertical_z = int((batch_z+2)/2) # 竖边的长度
oblique_z = batch_z-vertical_z #斜边的长度
for j in range(0,vertical_z):
for i in range(0,len(s)):
if i%batch_z == j or i%batch_z == batch_z-j:
new_s.append(s[i])
new_s = ''.join(new_s) # 将列表里的元素放在一个字符串里面
return new_s
if __name__ == '__main__':
solution1 = Solution()
s = "12345678"
#s = "abcdefghi"
#s = "a"
print("s=",s)
numRows = 1
new_s = solution1.convert(s,numRows)
print(new_s)