Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned.

Note:

• Only the space character ' ' is considered as whitespace character.
• Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: $[−2^{31}, 2^{31} − 1]$. If the numerical value is out of the range of representable values, INT_MAX ($2^{31} − 1)$ or INT_MIN ($−2^{31}$) is returned.

Example 1:

 12 Input: "42" Output: 42 

Example 2:

 1234 Input: " -42" Output: -42 Explanation: The first non-whitespace character is '-', which is the minus sign. Then take as many numerical digits as possible, which gets 42. 

Example 3:

 123 Input: "4193 with words" Output: 4193 Explanation: Conversion stops at digit '3' as the next character is not a numerical digit. 

Example 4:

 1234 Input: "words and 987" Output: 0 Explanation: The first non-whitespace character is 'w', which is not a numerical digit or a +/- sign. Therefore no valid conversion could be performed. 

Example 5:

 1234 Input: "-91283472332" Output: -2147483648 Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer. Thefore INT_MIN (−231) is returned 

Related Topics: MathString

## 解題邏輯與實作

1. 字串前後若有空字元，不影響轉換：
這好處理，字串進來先執行 str.strip() 即可。

2. 有非數字字元的狀況：
這狀況有兩種，一種非數字字元（非正負號）是出現字首，則回傳 0 ；若非數字字元出現在中間或字尾，則將非數字字元之後全部省略。

3. 最後是 overflow 的狀況：
但這對 python 來說可以最後在判斷就好。

 1234567891011121314 import re class Solution: def myAtoi(self, str: str) -> int: INT_MAX = 2147483647 INT_MIN = -2147483648 val_str = re.match('(^[\-]?\d+)', str.strip()) if not val_str : return 0 val = int(val_str.group(0)) val = min(INT_MAX, max(INT_MIN, val)) return val 

 123456789101112131415161718192021 class Solution: def myAtoi(self, str: str) -> int: INT_MAX = 2147483647 INT_MIN = -2147483648 str = str.strip() if len(str) == 0 : return 0 sign = 1 val = 0 if str in ["-", "+"]: sign = 1 if str == '+' else -1 str = str[1:] for char in str: if not char.isdigit(): break val = val * 10 + (ord(char) - ord("0")) return min(INT_MAX, max(INT_MIN, val * sign))