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 diff --git a/arai60/zigzag_conversion/phase2.py b/arai60/zigzag_conversion/phase2.py new file mode 100644 index 0000000..532e6fe --- /dev/null +++ b/arai60/zigzag_conversion/phase2.py @@ -0,0 +1,36 @@ +# 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_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 + #{0: 0, 1: 1, 2: 2, ..., numRows - 1: numRows - 1} + 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 + # 周期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_column_index + +def create_remain_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_column_index = create_string_index_to_column_index(numRows) + for string_index, string in enumerate(s): + 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 \ No newline at end of file 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 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