返回
算法(Leetode,附思维导图 + 全部解法)300题之(8)字符串转换整数 (atoi) 导读:一 题目描述## 二 解法总览(思维导图)## 三 全部解法 1 方案1 1)代码: 2 方案2
前端
2023-11-25 10:18:59
一 题目
给定一个字符串,请将它转换成一个整数。这个字符串可能包含空格,符号(+,-)以及数字。
例如,字符串"123"可以被转换成整数123。
字符串" -123"可以被转换成整数-123。
字符串" 123 "可以被转换成整数123。
字符串" +123 "可以被转换成整数123。
字符串"123.45"不可以被转换成整数。
字符串"123e10"不可以被转换成整数。
字符串"-91283472332"不可以被转换成整数。
请注意,在转换过程中,字符串中的任何空格都被忽略,并且数字必须满足32位有符号整数的范围([-2^31, 2^31 - 1])。
二 解法总览(思维导图)
为了帮助您更好地理解算法的解法,我们提供了以下思维导图,展示了解法总览:
解法总览(思维导图)
+-----------------------+
| |
| |
+------+ +------+
| 方案1 | | 方案2 |
+------+ +------+
| |
V V
+----------+ +----------+
| 读取字符串 | | 读取字符串 |
+----------+ +----------+
| |
| |
+-------+ +-------+
| 去除空格 | | 去除空格 |
+-------+ +-------+
| |
| |
+---------+ +---------+
| 检查符号 | | 检查符号 |
+---------+ +---------+
| |
| |
+---------+ +---------+
| 转换为数字 | | 转换为数字 |
+---------+ +---------+
| |
| |
+-----------+ +-----------+
| 检查范围 | | 检查范围 |
+-----------+ +-----------+
| |
| |
+----------+ +----------+
| 返回结果 | | 返回结果 |
+----------+ +----------+
三 全部解法
1 方案1
方案1是一种较为简单直观的解法,其步骤如下:
- 读取字符串。
- 去除字符串中的空格。
- 检查字符串中的符号(+,-)。
- 将字符串转换为数字。
- 检查数字是否在32位有符号整数的范围内([-2^31, 2^31 - 1])。
- 返回结果。
1)代码:
def atoi(s):
"""
Convert a string to an integer.
Args:
s: The string to convert.
Returns:
The integer value of the string.
"""
# Remove leading and trailing whitespace.
s = s.strip()
# Check if the string is empty.
if not s:
return 0
# Check if the first character is a sign.
sign = 1
if s[0] in ('-', '+'):
sign = -1 if s[0] == '-' else 1
s = s[1:]
# Convert the string to an integer.
num = 0
for c in s:
if not c.isdigit():
break
num = num * 10 + ord(c) - ord('0')
# Check if the number is within the range of a 32-bit signed integer.
if num < -2**31:
return -2**31
elif num > 2**31 - 1:
return 2**31 - 1
# Return the result.
return sign * num
2 方案2
方案2是一种更加严谨的解法,其步骤如下:
- 读取字符串。
- 去除字符串中的空格。
- 检查字符串中的符号(+,-)。
- 将字符串转换为数字,并考虑数字的进制(10进制或8进制)。
- 检查数字是否在32位有符号整数的范围内([-2^31, 2^31 - 1])。
- 返回结果。
代码:
def atoi(s):
"""
Convert a string to an integer.
Args:
s: The string to convert.
Returns:
The integer value of the string.
"""
# Remove leading and trailing whitespace.
s = s.strip()
# Check if the string is empty.
if not s:
return 0
# Check if the first character is a sign.
sign = 1
if s[0] in ('-', '+'):
sign = -1 if s[0] == '-' else 1
s = s[1:]
# Check if the first character is a digit.
if not s[0].isdigit():
return 0
# Check if the string is in hexadecimal format.
if s[0] == '0' and s[1] in ('x', 'X'):
base = 16
s = s[2:]
else:
base = 10
# Convert the string to an integer.
num = 0
for c in s:
if c.isdigit():
num = num * base + ord(c) - ord('0')
elif c in ('a', 'b', 'c', 'd', 'e', 'f'):
num = num * base + ord(c) - ord('a') + 10
elif c in ('A', 'B', 'C', 'D', 'E', 'F'):
num = num * base + ord(c) - ord('A') + 10
else:
break
# Check if the number is within the range of a 32-bit signed integer.
if num < -2**31:
return -2**31
elif num > 2**31 - 1:
return 2**31 - 1
# Return the result.
return sign * num
总结
本文详细介绍了算法(Leetode,附思维导图 + 全部解法)300题之(8)字符串转换整数 (atoi)。我们首先提供了题目,帮助您理解题目要求。然后,我们通过思维导图的方式,为您呈现了解法总览。最后,我们提供了两种不同的解法方案,每种方案都包括代码示例,帮助您更好地理解算法的实现。希望本文对您有所帮助。