返回

以 LeetCode 题单开启算法之旅:第 8 题——字符串转换整数 (atoi) 的奇妙之旅

前端

程序员的世界总是离不开算法。

记得我刚开始学习编程的时候,对算法一窍不通,看到代码中复杂的算法逻辑,就觉得头晕脑胀。但随着学习的深入,我逐渐意识到算法的重要性。算法是程序员解决问题、实现功能的利器,也是程序员必备的基本功。

最近,我在看框架源码时,会有很多算法的实现逻辑。一开始,我感到吃力,但后来我决定蹭着假期,加强算法和数据结构的学习。于是,我制定了一个计划,每天刷一道 LeetCode 题目,并把刷题经验和心得写成博客文章,分享给大家。

今天,我要分享的是 LeetCode 题单中的第 8 题——字符串转换整数 (atoi)。这是一道经典的题目,也是面试官经常会问到的题目。

题目

给定一个字符串,将字符串转换成一个整数。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42

示例 3:

输入: "4193 with words"
输出: 4193

示例 4:

输入: "words and 987"
输出: 0

示例 5:

输入: "-91283472332"
输出: -2147483648

解题思路

这道题的解题思路其实很简单,就是按照以下步骤来做:

  1. 去除字符串首尾的空格。
  2. 判断字符串的符号。
  3. 将字符串中的数字部分提取出来。
  4. 将数字部分转换为整数。
  5. 返回转换后的整数。

实现细节

在实现 atoi 函数时,需要注意以下几点:

  • 如果字符串为空,则返回 0。
  • 如果字符串的首字符不是数字、正号或负号,则返回 0。
  • 如果字符串中出现多个正号或负号,则只考虑第一个正号或负号。
  • 如果字符串中出现非数字字符,则忽略该字符之后的字符。
  • 如果转换后的整数超过了 32 位有符号整数的范围,则返回 INT_MAX 或 INT_MIN。

代码实现

def atoi(s: str) -> int:
    """
    将字符串转换成一个整数。

    Args:
        s: 要转换的字符串。

    Returns:
        转换后的整数。
    """

    # 去除字符串首尾的空格。
    s = s.strip()

    # 判断字符串的符号。
    if s[0] == '-':
        negative = True
        s = s[1:]
    elif s[0] == '+':
        negative = False
        s = s[1:]
    else:
        negative = False

    # 将字符串中的数字部分提取出来。
    i = 0
    while i < len(s) and s[i].isdigit():
        i += 1

    # 将数字部分转换为整数。
    num = int(s[:i])

    # 返回转换后的整数。
    if negative:
        num = -num

    if num > 2**31 - 1:
        return 2**31 - 1

    if num < -2**31:
        return -2**31

    return num

总结

通过对 LeetCode 题单中第 8 题——字符串转换整数 (atoi) 的分析和实现,我们不仅学到了如何将字符串转换为整数,还掌握了在实现 atoi 函数时需要注意的技巧。希望本文对大家有所帮助。