返回

易如反掌,快跟我一起学LeetCode 8字符串转数字题解!

前端

导语:

大家好,欢迎来到 LeetCode 8 的题解文章。今天,我们将一起探索如何将一个字符串转换为一个整数。这是一个非常经典且有趣的问题,相信很多朋友都遇到过。我们将在本文中介绍几种不同的方法来解决这个问题,并提供详细的代码示例和解释。无论是初学者还是经验丰富的程序员,都可以通过这篇文章来提高自己的编程能力和解决问题的能力。

题目背景:

LeetCode 8 的题目如下:

给定一个字符串,将它转换成一个整数(无符号)。

这个字符串可以是正数、负数、或者是零。

这个字符串中不得包含除了数字之外的其他字符。

如果字符串中包含除了数字之外的其他字符,或者字符串为空,那么返回 0。

解题思路:

解决这个问题有多种方法。这里,我们将介绍两种最常见的解法:

方法一:使用正则表达式

使用正则表达式可以很方便地从字符串中提取数字。我们可以使用以下正则表达式来匹配一个合法的数字字符串:

^-?[0-9]+$

这个正则表达式表示:

  • ^:匹配字符串的开头。
  • -?:匹配一个可选的负号。
  • [0-9]+:匹配一个或多个数字。
  • $:匹配字符串的结尾。

如果字符串符合这个正则表达式,那么我们就可以使用 Integer.parseInt() 方法将其转换为一个整数。

方法二:使用有限状态机

有限状态机是一种非常强大的工具,可以用来解决各种各样的问题。我们可以使用有限状态机来解决这个问题,如下所示:

  1. 定义有限状态机的状态。在这个问题中,我们可以定义以下几个状态:

    • 开始状态:表示字符串的开始。
    • 数字状态:表示字符串中的数字。
    • 符号状态:表示字符串中的符号(正号或负号)。
    • 结束状态:表示字符串的结束。
  2. 定义有限状态机的转移函数。转移函数指定了当有限状态机处于某个状态时,在读入某个字符后,有限状态机将转移到哪个状态。

  3. 定义有限状态机的输出函数。输出函数指定了当有限状态机处于某个状态时,有限状态机将输出什么。

我们可以根据以上步骤来构造一个有限状态机,并使用它来解决这个问题。

代码示例:

下面是使用两种方法解决这个问题的代码示例:

方法一:使用正则表达式

public class Solution {
    public int myAtoi(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }

        str = str.trim();

        Pattern pattern = Pattern.compile("^-?[0-9]+
public class Solution {
    public int myAtoi(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }

        str = str.trim();

        Pattern pattern = Pattern.compile("^-?[0-9]+$");
        Matcher matcher = pattern.matcher(str);

        if (!matcher.matches()) {
            return 0;
        }

        int result = Integer.parseInt(str);

        if (result > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        } else if (result < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }

        return result;
    }
}
quot;
); Matcher matcher = pattern.matcher(str); if (!matcher.matches()) { return 0; } int result = Integer.parseInt(str); if (result > Integer.MAX_VALUE) { return Integer.MAX_VALUE; } else if (result < Integer.MIN_VALUE) { return Integer.MIN_VALUE; } return result; } }

方法二:使用有限状态机

public class Solution {
    public int myAtoi(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }

        str = str.trim();

        int state = 0; // 开始状态

        int result = 0;
        int sign = 1; // 正数

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            switch (state) {
                case 0: // 开始状态
                    if (c == '-') {
                        sign = -1;
                        state = 1; // 符号状态
                    } else if (c == '+') {
                        sign = 1;
                        state = 1; // 符号状态
                    } else if (c >= '0' && c <= '9') {
                        result = c - '0';
                        state = 2; // 数字状态
                    } else {
                        return 0; // 不合法的字符
                    }
                    break;
                case 1: // 符号状态
                    if (c >= '0' && c <= '9') {
                        result = c - '0';
                        state = 2; // 数字状态
                    } else {
                        return 0; // 不合法的字符
                    }
                    break;
                case 2: // 数字状态
                    if (c >= '0' && c <= '9') {
                        result = result * 10 + (c - '0');

                        if (result > Integer.MAX_VALUE) {
                            return Integer.MAX_VALUE;
                        }
                    } else {
                        state = 3; // 结束状态
                    }
                    break;
                case 3: // 结束状态
                    break;
            }
        }

        return result * sign;
    }
}

结语:

希望这篇文章对大家有所帮助。如果你还有其他问题,欢迎在评论区留言。我们将在第一时间回复你。感谢大家的阅读!