From 9d6179574351b525546e393ad394d4b56982aec3 Mon Sep 17 00:00:00 2001
From: mike <59136831+Mike0121@users.noreply.github.com>
Date: Tue, 4 Jun 2024 23:47:19 +0900
Subject: [PATCH 1/2] Create 8. String to Integer (atoi).md
https://leetcode.com/problems/string-to-integer-atoi/description/
---
.../8. String to Integer (atoi).md" | 120 ++++++++++++++++++
1 file changed, 120 insertions(+)
create mode 100644 "\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
new file mode 100644
index 0000000..1ba984a
--- /dev/null
+++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
@@ -0,0 +1,120 @@
+解けなかったため、他参加者の答えを参考に何度か書いてみた後、自力で再現。
+### 1回目
+時間計算量: O(N)
+空間計算量: O(N)
+N: len(s)
+
+```python
+class Solution:
+ def myAtoi(self, s: str) -> int:
+ s = s.lstrip()
+ if not s:
+ return 0
+
+ negative_flag = False
+ index = 0
+ if s[index] == "-" or s[index] == "+":
+ if s[index] == "-":
+ negative_flag = True
+ index += 1
+
+ digits_str = ""
+ while index < len(s):
+ if s[index].isdigit():
+ digits_str += s[index]
+ index += 1
+ else:
+ break
+ if not digits_str:
+ return 0
+
+ digits_int = int(digits_str)
+ if negative_flag:
+ digits_int *= -1
+
+ MAX_INT = 2 ** 31 - 1
+ MIN_INT = -2 ** 31
+ if digits_int > MAX_INT:
+ return MAX_INT
+ elif digits_int < MIN_INT:
+ return MIN_INT
+ else:
+ return digits_int
+```
+
+### 2回目
+他参加者の回答を参考に、下記を書き換えてみる。
+- lstripを自前で実装。
+- negative_flagをsignに変更。
+- 符号の条件判定を、in ('-', '+')に変更。
+- INT_MAX, INT_MINをビット演算で実装。
+- intへの変換を自前で実装。(ordの利用)
+- 実装後、各種フラッグなどの変数を上に移動。
+
+sを直接いじるより、indexを動かしていく方がわかりやすくかつsを壊さないため安心かと思った。
+
+```python
+class Solution:
+ def myAtoi(self, s: str) -> int:
+ index = 0
+ sign = 1
+ MAX_INT = (1 << 31) - 1
+ MIN_INT = - (1 << 31)
+
+ while index < len(s) and s[index].isspace():
+ index += 1
+ if index == len(s):
+ return 0
+
+ if s[index] in ('-', '+'):
+ if s[index] == '-':
+ sign = -1
+ index += 1
+ if index == len(s):
+ return 0
+
+ final_integer = 0
+ while index < len(s) and s[index].isdigit():
+ digit = ord(s[index]) - ord('0')
+ final_integer = 10 * final_integer + sign * digit
+ if final_integer > MAX_INT:
+ return MAX_INT
+ if final_integer < MIN_INT:
+ return MIN_INT
+ index += 1
+
+ return final_integer
+```
+
+### 3回目
+```python
+class Solution:
+ def myAtoi(self, s: str) -> int:
+ index = 0
+ sign = 1
+ MAX_INT = (1 << 31) - 1
+ MIN_INT = - (1 << 31)
+
+ while index < len(s) and s[index].isspace():
+ index += 1
+ if index == len(s):
+ return 0
+
+ if s[index] in ('+', '-'):
+ if s[index] == '-':
+ sign = -1
+ index += 1
+ if index == len(s):
+ return 0
+
+ final_integer = 0
+ while index < len(s) and s[index].isdigit():
+ digit = ord(s[index]) - ord('0')
+ final_integer = 10 * final_integer + sign * digit
+ if final_integer > MAX_INT:
+ return MAX_INT
+ if final_integer < MIN_INT:
+ return MIN_INT
+ index += 1
+ return final_integer
+```
From e9b656b2884a3bdfd84d9f607ced36acd2f31708 Mon Sep 17 00:00:00 2001
From: mike <59136831+Mike0121@users.noreply.github.com>
Date: Fri, 7 Jun 2024 18:56:54 +0900
Subject: [PATCH 2/2] Update 8. String to Integer (atoi).md
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
4回目を追記
---
.../8. String to Integer (atoi).md" | 36 +++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
index 1ba984a..86f4f8c 100644
--- "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
+++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/8. String to Integer (atoi).md"
@@ -118,3 +118,39 @@ class Solution:
index += 1
return final_integer
```
+
+### 4回目
+```python
+class Solution:
+ def myAtoi(self, s: str) -> int:
+ index = 0
+ sign = 1
+ MAX_INT = (1 << 31) - 1
+ MIN_INT = - (1 << 31)
+
+ while index < len(s) and s[index].isspace():
+ index += 1
+
+ if index == len(s):
+ return 0
+
+ if s[index] in ('+', '-'):
+ if s[index] == '-':
+ sign = -1
+ index += 1
+
+ if index == len(s):
+ return 0
+
+ digits_integer = 0
+ while index < len(s) and s[index].isdigit():
+ digit = ord(s[index]) - ord('0')
+ digits_integer = 10 * digits_integer + sign * digit
+ if digits_integer > MAX_INT:
+ return MAX_INT
+ if digits_integer < MIN_INT:
+ return MIN_INT
+ index += 1
+
+ return digits_integer
+```