<div>
Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++'s atoi function).
The algorithm for myAtoi(string s) is as follows:
- Read in and ignore any leading whitespace.
- Check if the next character (if not already at the end of the string) is
'-'or'+'. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present. - Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
- Convert these digits into an integer (i.e.
"123" -> 123,"0032" -> 32). If no digits were read, then the integer is0. Change the sign as necessary (from step 2). - If the integer is out of the 32-bit signed integer range
[-2<sup>31</sup>, 2<sup>31</sup> - 1], then clamp the integer so that it remains in the range. Specifically, integers less than-2<sup>31</sup>should be clamped to-2<sup>31</sup>, and integers greater than2<sup>31</sup> - 1should be clamped to2<sup>31</sup> - 1. - Return the integer as the final result.
Note:
- Only the space character
' 'is considered a whitespace character. - Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.
Example 1:
<pre>Input: s = "42" Output: 42 Explanation: The underlined characters are what is read in, the caret is the current reader position. Step 1: "42" (no characters read because there is no leading whitespace) ^ Step 2: "42" (no characters read because there is neither a '-' nor '+') ^ Step 3: "<u>42</u>" ("42" is read in) ^ The parsed integer is 42. Since 42 is in the range [-2<sup>31</sup>, 2<sup>31</sup> - 1], the final result is 42. </pre>
Example 2:
<pre>Input: s = " -42" Output: -42 Explanation: Step 1: "-42" (leading whitespace is read and ignored) ^ Step 2: " <u>-</u>42" ('-' is read, so the result should be negative) ^ Step 3: " -<u>42</u>" ("42" is read in) ^ The parsed integer is -42. Since -42 is in the range [-2<sup>31</sup>, 2<sup>31</sup> - 1], the final result is -42. </pre>
Example 3:
<pre>Input: s = "4193 with words" Output: 4193 Explanation: Step 1: "4193 with words" (no characters read because there is no leading whitespace) ^ Step 2: "4193 with words" (no characters read because there is neither a '-' nor '+') ^ Step 3: "<u>4193</u> with words" ("4193" is read in; reading stops because the next character is a non-digit) ^ The parsed integer is 4193. Since 4193 is in the range [-2<sup>31</sup>, 2<sup>31</sup> - 1], the final result is 4193. </pre>
Constraints:
0 <= s.length <= 200sconsists of English letters (lower-case and upper-case), digits (0-9),' ','+','-', and'.'.
</div>
题目大意:
字符串转整数
解题思路:
关键是第一位是否符号的判断,之后是ord函数的运用
解题步骤:
N/A
注意事项:
- 空字符或全空格返回0
- [key]若有符号只能第一位是符号,连续是符号不合法返回0,如-+12, 将符号处理放在循环外
- 除符号外,若第一位为非数字,不合法,返回0
- 循环内,若出现非数字,跳出循环
- 计算符号,然后检查数字范围
Python代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24def myAtoi(self, s: str) -> int:
s = s.strip()
if not s:
return 0
sign = 1
if s[0] == '-':
sign = -1
s = s[1:]
elif s[0] == '+':
s = s[1:]
if s and not s[0].isdigit():
return 0
res = 0
for char in s:
if char.isdigit():
res = res * 10 + ord(char) - ord('0')
else:
break
res *= sign
if res < -pow(2, 31):
return -pow(2, 31)
if res > pow(2, 31) - 1:
return pow(2, 31) - 1
return res
算法分析:
时间复杂度为O(n),空间复杂度O(1)


