返回

剑指 Offer 67. 把字符串转换成整数 II

后端

文章正文

一、问题引言

1. 问题概要

剑指 Offer 67. 把字符串转换成整数 II 要求将一个字符串转换成一个整数,该字符串可能包含数字、符号(+/-)和空格。

2. 问题难点

  • 字符串解析: 需要将字符串中的数字字符提取出来,并根据其位置确定其权重。
  • 符号处理: 需要正确处理字符串中的符号(+/-),确定数字的正负性。
  • 溢出处理: 需要考虑字符串转换后的整数是否会溢出,并采取相应措施。

二、解决方案

1. 算法步骤

  1. 字符串解析:

    • 使用正则表达式或其他方法从字符串中提取数字字符。
    • 将数字字符按照其在字符串中的位置,从左到右依次存储。
  2. 符号处理:

    • 检查字符串中是否有符号(+/-),并确定数字的正负性。
    • 如果没有符号,则默认数字为正数。
  3. 溢出处理:

    • 使用大整数数据类型来存储转换后的整数,以避免溢出。
    • 在转换过程中,需要不断检查转换后的整数是否会溢出,并采取相应措施。
  4. 结果返回:

    • 将转换后的整数返回给调用者。

2. 代码实现

class Solution {
    /**
     * 将字符串转换成整数 II
     * @param str 输入的字符串
     * @return 转换后的整数
     */
    public int myAtoi(String str) {
        // 1. 字符串解析
        String numberStr = str.replaceAll("[^0-9+-]", "");
        if (numberStr.isEmpty()) {
            return 0;
        }

        // 2. 符号处理
        boolean isNegative = numberStr.charAt(0) == '-';
        if (isNegative || numberStr.charAt(0) == '+') {
            numberStr = numberStr.substring(1);
        }

        // 3. 溢出处理
        long result = 0;
        for (char c : numberStr.toCharArray()) {
            int digit = c - '0';
            result = result * 10 + digit;
            if (result > Integer.MAX_VALUE) {
                return isNegative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
        }

        // 4. 结果返回
        return isNegative ? -(int) result : (int) result;
    }
}

三、总结

剑指 Offer 67. 把字符串转换成整数 II 是一个经典的问题,它考验了程序员对字符串处理、符号处理和溢出处理的掌握程度。通过本文的讲解,希望读者能够对该问题有更深入的理解,并能够编写出更加高效、 robust 的解决方案。

四、进阶思考

1. 边界条件处理

在实际应用中,我们可能会遇到一些边界条件,例如:

  • 输入字符串为空或全是空格
  • 输入字符串包含非数字字符
  • 输入字符串包含多个符号
  • 输入字符串的绝对值非常大

对于这些边界条件,我们需要进行特殊处理,以确保程序能够正确运行。

2. 性能优化

如果我们希望进一步优化程序的性能,我们可以考虑使用一些更快的字符串处理技术,例如:

  • 使用StringBuilder或其他高效的字符串拼接技术
  • 使用位运算来代替字符串比较

通过这些优化,我们可以进一步提高程序的运行效率。