From 484792a21cbd8c6b8ce0f7a972cb1042e728a871 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Wed, 17 Apr 2024 00:58:43 +0900 Subject: [PATCH 1/5] phase1 --- arai60/zigzag_conversion/phase1.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 arai60/zigzag_conversion/phase1.py diff --git a/arai60/zigzag_conversion/phase1.py b/arai60/zigzag_conversion/phase1.py new file mode 100644 index 0000000..c1e1323 --- /dev/null +++ b/arai60/zigzag_conversion/phase1.py @@ -0,0 +1,25 @@ +def create_string_index_to_store_index(numRows: int)->dict: + string_index_to_store_index = {} + for index in range(numRows): + string_index_to_store_index[index] = index + #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1} + for index in range(numRows-2): + string_index_to_store_index[index + numRows] = numRows - index - 2 + # 周期2*numRows - 2で変化するindexの辞書ができた + return string_index_to_store_index + +def string_index(index, numRows): + if numRows == 1: + return 0 + return index % (2 * numRows - 2) + +class Solution: + def convert(self, s: str, numRows: int) -> str: + concat_strings = ["" for _ in range(numRows)] + string_index_to_store_index = create_string_index_to_store_index(numRows) + for index, string in enumerate(s): + concat_strings[string_index_to_store_index[string_index(index, numRows)]] += string + concated_string = "" + for string in concat_strings: + concated_string += string + return concated_string \ No newline at end of file From e89fcfac0a49b59c7398123507a6bb2f512a5287 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Wed, 17 Apr 2024 01:23:00 +0900 Subject: [PATCH 2/5] phase2 --- arai60/zigzag_conversion/phase2.py | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 arai60/zigzag_conversion/phase2.py diff --git a/arai60/zigzag_conversion/phase2.py b/arai60/zigzag_conversion/phase2.py new file mode 100644 index 0000000..ba05e04 --- /dev/null +++ b/arai60/zigzag_conversion/phase2.py @@ -0,0 +1,38 @@ +# discordで他の人の回答も見てみた。 +# 結構な人が文字列をガチャガチャしていていた +# https://github.com/nittoco/leetcode/pull/4/files, https://github.com/hayashi-ay/leetcode/pull/71/files +# 僕も最初思いついた解法は, 1行目は周期ずつ文字列を飛ばす, 2行目は周期ずつ文字列を飛ばし, +# 何個か戻ったところに文字があるのでそれを回収してくる...のような方法でいこうとしたが, 頭がこんがらがってしまい, 他にいい方法がないかを考えてみた。 +# i行目にある文字は表現するためには, 文字列のj-index番目とnumRowsに関する何らかの余りで表現できることに気づいたので, それを用いた。 + +def create_string_index_to_col_index(numRows: int)->dict: + string_index_to_col_index = {} + for string_index in range(numRows): + col_index = string_index + string_index_to_col_index[string_index] = col_index + #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1} + for difference_index in range(numRows - 2): + string_index = numRows + difference_index + col_index = numRows - difference_index - 2 + string_index_to_col_index[string_index] = col_index + # 周期2*numRows - 2で変化するindexの辞書ができた + #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1, numRows: numRows - 2, ..., 2 * numRows - 3: 1} + return string_index_to_col_index + +def create_col_index(index, numRows): + if numRows == 1: + return 0 + return index % (2 * numRows - 2) + +class Solution: + def convert(self, s: str, numRows: int) -> str: + concat_strings = ["" for _ in range(numRows)] + string_index_to_col_index = create_string_index_to_col_index(numRows) + for string_index, string in enumerate(s): + concat_strings[string_index_to_col_index[create_col_index(string_index, numRows)]] += string + concated_string = "" + for string in concat_strings: + concated_string += string + return concated_string + +print(create_string_index_to_col_index(3)) \ No newline at end of file From 4e76c51ebe0f5c03cd8b125f6c58d865c43426d8 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Wed, 17 Apr 2024 01:34:57 +0900 Subject: [PATCH 3/5] =?UTF-8?q?phase2:=20=E3=81=82=E3=81=BE=E3=82=8A?= =?UTF-8?q?=E3=82=92=E6=B1=82=E3=82=81=E3=82=8B=E9=96=A2=E6=95=B0=E3=81=AA?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E5=90=8D=E5=89=8D=E3=82=92=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arai60/zigzag_conversion/phase2.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/arai60/zigzag_conversion/phase2.py b/arai60/zigzag_conversion/phase2.py index ba05e04..532e6fe 100644 --- a/arai60/zigzag_conversion/phase2.py +++ b/arai60/zigzag_conversion/phase2.py @@ -5,21 +5,21 @@ # 何個か戻ったところに文字があるのでそれを回収してくる...のような方法でいこうとしたが, 頭がこんがらがってしまい, 他にいい方法がないかを考えてみた。 # i行目にある文字は表現するためには, 文字列のj-index番目とnumRowsに関する何らかの余りで表現できることに気づいたので, それを用いた。 -def create_string_index_to_col_index(numRows: int)->dict: - string_index_to_col_index = {} +def create_string_index_to_column_index(numRows: int)->dict: + string_index_to_column_index = {} for string_index in range(numRows): - col_index = string_index - string_index_to_col_index[string_index] = col_index + column_index = string_index + string_index_to_column_index[string_index] = column_index #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1} for difference_index in range(numRows - 2): string_index = numRows + difference_index - col_index = numRows - difference_index - 2 - string_index_to_col_index[string_index] = col_index + column_index = numRows - difference_index - 2 + string_index_to_column_index[string_index] = column_index # 周期2*numRows - 2で変化するindexの辞書ができた #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1, numRows: numRows - 2, ..., 2 * numRows - 3: 1} - return string_index_to_col_index + return string_index_to_column_index -def create_col_index(index, numRows): +def create_remain_string_index(index, numRows): if numRows == 1: return 0 return index % (2 * numRows - 2) @@ -27,12 +27,10 @@ def create_col_index(index, numRows): class Solution: def convert(self, s: str, numRows: int) -> str: concat_strings = ["" for _ in range(numRows)] - string_index_to_col_index = create_string_index_to_col_index(numRows) + string_index_to_column_index = create_string_index_to_column_index(numRows) for string_index, string in enumerate(s): - concat_strings[string_index_to_col_index[create_col_index(string_index, numRows)]] += string + concat_strings[string_index_to_column_index[create_remain_string_index(string_index, numRows)]] += string concated_string = "" for string in concat_strings: concated_string += string - return concated_string - -print(create_string_index_to_col_index(3)) \ No newline at end of file + return concated_string \ No newline at end of file From 2740ace8da22bbf463447871770aa45b57f946d9 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Wed, 17 Apr 2024 01:41:51 +0900 Subject: [PATCH 4/5] phase3 --- arai60/zigzag_conversion/phase3.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 arai60/zigzag_conversion/phase3.py diff --git a/arai60/zigzag_conversion/phase3.py b/arai60/zigzag_conversion/phase3.py new file mode 100644 index 0000000..6870285 --- /dev/null +++ b/arai60/zigzag_conversion/phase3.py @@ -0,0 +1,28 @@ +def create_string_index_to_column_index(numRows: int)->dict: + string_index_to_column_index = {} + for string_index in range(numRows): + column_index = string_index + string_index_to_column_index[string_index] = column_index + for difference_index in range(numRows-2): + string_index = numRows + difference_index + column_index = numRows - difference_index - 2 + string_index_to_column_index[string_index] = column_index + # return dict: {0:0, 1:1, ..., numRows-1: numRows-1, numRows: numRows-2, ..., 2*numRows-3:1} + return string_index_to_column_index + +def create_remain_string_index(string_index, numRows): + if numRows == 1: + return 0 + return string_index % (2 * numRows - 2) + +class Solution: + def convert(self, s: str, numRows: int) -> str: + concat_strings = ["" for _ in range(numRows)] #Store the strings of each column + string_index_to_column_index = create_string_index_to_column_index(numRows) #dict: string_index->column_index + for string_index, string in enumerate(s): + column_index = string_index_to_column_index[create_remain_string_index(string_index, numRows)] + concat_strings[column_index] += string + concated_string = "" + for string in concat_strings: + concated_string += string + return concated_string \ No newline at end of file From 31b5dfee17cf336d5c5cccdfc459aaa0ac21ebdf Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Fri, 26 Apr 2024 20:43:44 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AA=E3=81=A9=E3=82=92=E5=85=83=E3=81=AB=E8=A8=82=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arai60/zigzag_conversion/phase4.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 arai60/zigzag_conversion/phase4.py diff --git a/arai60/zigzag_conversion/phase4.py b/arai60/zigzag_conversion/phase4.py new file mode 100644 index 0000000..42bdf03 --- /dev/null +++ b/arai60/zigzag_conversion/phase4.py @@ -0,0 +1,30 @@ +""" +Reference +shining-ai san: https://github.com/shining-ai/leetcode/pull/60/files +周期を考えて, 何番目のrowにいれるかという解法をstep1-3から書いてきたが, +shining-aiのコードを見てrowの移動方向を変える方が頭のリソースの節約にも, +空間計算量の節約にもつながることに気づいたので使ってみます + + +""" + +class Solution: + def convert(self, s: str, numRows: int) -> str: + if numRows == 1: + return s + + row_strings = [[] for _ in range(numRows)] + + direction = 1 + row_index = 0 + for c in s: + row_strings[row_index].append(c) + + if row_index == 0: + direction = 1 + elif row_index == numRows - 1: + direction = -1 + + row_index += direction + + return "".join(row_char for row_string in row_strings for row_char in row_string) \ No newline at end of file