問題の説明:与えられた行数に従って、与えられた文字列を上から下へ、左から右へジグザグに配置します。(入力文字列sと行数numRows、新しい順序で出力)
たとえば、入力文字列が "LEETCODEISHIRING"で、行数が3の場合、配置は次のようになります。
L C I R
E T O E S I I G
E D H N
方法1:法律を見つける
1.モジュール性
上記の例の形式からわかるように、これらのZは重複しているため、「LEET」などの小さなモジュールとして「1つの垂直」と「1つの言及」を最初に考えることができます。小さなモジュール、2番目の小さなモジュールとして「CODE」を使用します...
2.モジュールのサイズを決定する
まず、より代表的な例を見つけます。
L D R
E O E I I
E C I H N
T S G
:私たちは、「刺し」小さなモジュールは、より良い「言及」以上の2文字以上で、かつ「刺し」の文字の数は、それが推定され、そこからnumRowsの数の小さなモジュールのサイズにすることができます行数であると結論付けることができます
batch_z = 2 * numRows-2
3.出力関係を決定
する行で出力する場合(例として2番目の例を取り上げます)、
行0の0、1、2、および3の要素には0%6 = 0、6%6 = 0、12%6 = 0があります。 18%6 = 0
ライン1、ライン1、1、2、3の要素には1%6 = 1,7%6 = 1,13%6 = 1,19%6 = 1
···
出力順序はこれから導出できます
4.手順
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)