diff --git a/arai60/54-60_others/60_6_Zigzag Conversion/level_1.py b/arai60/54-60_others/60_6_Zigzag Conversion/level_1.py new file mode 100644 index 0000000..7541e3c --- /dev/null +++ b/arai60/54-60_others/60_6_Zigzag Conversion/level_1.py @@ -0,0 +1,20 @@ +# 各行の文字列をリストに格納して、最後に結合する。 +class Solution: + def convert(self, s: str, numRows: int) -> str: + if numRows == 1: + return s + rows = [[] for _ in range(numRows)] + num_row = 0 + direction = 1 + for c in s: + rows[num_row].append(c) + if num_row == 0: # 0行目で折り返し + direction = 1 + if num_row == numRows - 1: # 最終行で折り返し + direction = -1 + num_row += direction + merged_all_rows = [] + for row in rows: + merged_all_rows.extend(row) + zigzag_string = "".join(merged_all_rows) + return zigzag_string diff --git a/arai60/54-60_others/60_6_Zigzag Conversion/level_2.py b/arai60/54-60_others/60_6_Zigzag Conversion/level_2.py new file mode 100644 index 0000000..c2e1e81 --- /dev/null +++ b/arai60/54-60_others/60_6_Zigzag Conversion/level_2.py @@ -0,0 +1,26 @@ +# 何行目になるかは規則性があるので計算で求められる +# 2*n-2個周期で行が繰り返される +# 0 6 +# 1 5 7 +# 2 4 8 +# 3 +class Solution: + def convert(self, s: str, numRows: int) -> str: + if numRows == 1: + return s + rows = [[] for _ in range(numRows)] + cycle = 2 * numRows - 2 + for i in range(len(s)): + pos = i % (cycle) + if pos < numRows: # 下りのとき + num_row = pos + else: # 上りのとき + # [最下行] - [折り返して何個目か] + # (numRows - 1) - (pos - (numRows - 1)) + num_row = 2 * numRows - pos - 2 + rows[num_row].append(s[i]) + marged_all_rows = [] + for row in rows: + marged_all_rows.extend(row) + zigzag_string = "".join(marged_all_rows) + return zigzag_string diff --git a/arai60/54-60_others/60_6_Zigzag Conversion/level_3.py b/arai60/54-60_others/60_6_Zigzag Conversion/level_3.py new file mode 100644 index 0000000..a0c370b --- /dev/null +++ b/arai60/54-60_others/60_6_Zigzag Conversion/level_3.py @@ -0,0 +1,18 @@ +class Solution: + def convert(self, s: str, numRows: int) -> str: + if numRows == 1: + return s + rows = [[] for _ in range(numRows)] + num_row = 0 + direction = 1 + for c in s: + rows[num_row].append(c) + if num_row == 0: + direction = 1 + if num_row == numRows - 1: + direction = -1 + num_row += direction + merged_all_rows = [] + for row in rows: + merged_all_rows.extend(row) + return "".join(merged_all_rows) diff --git a/arai60/54-60_others/60_6_Zigzag Conversion/level_4.py b/arai60/54-60_others/60_6_Zigzag Conversion/level_4.py new file mode 100644 index 0000000..2138e64 --- /dev/null +++ b/arai60/54-60_others/60_6_Zigzag Conversion/level_4.py @@ -0,0 +1,15 @@ +class Solution: + def convert(self, s: str, numRows: int) -> str: + if numRows == 1: + return s + rows = [[] for _ in range(numRows)] + rows_index = 0 + direction = 1 + for c in s: + rows[rows_index].append(c) + if rows_index == 0: + direction = 1 + if rows_index == numRows - 1: + direction = -1 + rows_index += direction + return "".join(c for row in rows for c in row)