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 +```