返回

算法(Leetode,附思维导图 + 全部解法)300题之(8)字符串转换整数 (atoi) 导读:一 题目描述## 二 解法总览(思维导图)## 三 全部解法 1 方案1 1)代码: 2 方案2

前端

一 题目

给定一个字符串,请将它转换成一个整数。这个字符串可能包含空格,符号(+,-)以及数字。

例如,字符串"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是一种较为简单直观的解法,其步骤如下:

  1. 读取字符串。
  2. 去除字符串中的空格。
  3. 检查字符串中的符号(+,-)。
  4. 将字符串转换为数字。
  5. 检查数字是否在32位有符号整数的范围内([-2^31, 2^31 - 1])。
  6. 返回结果。
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是一种更加严谨的解法,其步骤如下:

  1. 读取字符串。
  2. 去除字符串中的空格。
  3. 检查字符串中的符号(+,-)。
  4. 将字符串转换为数字,并考虑数字的进制(10进制或8进制)。
  5. 检查数字是否在32位有符号整数的范围内([-2^31, 2^31 - 1])。
  6. 返回结果。
代码:
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)。我们首先提供了题目,帮助您理解题目要求。然后,我们通过思维导图的方式,为您呈现了解法总览。最后,我们提供了两种不同的解法方案,每种方案都包括代码示例,帮助您更好地理解算法的实现。希望本文对您有所帮助。