返回

LeetCode 8:字符串转换成整数(atoi)- 算法解析与技巧

前端

用简单步骤掌握字符串到整数转换

目录

  • 字符串到整数转换的算法步骤
  • 有用技巧
  • 代码示例(C++、Python、Java)
  • 总结
  • 常见问题解答

算法步骤

字符串到整数转换涉及以下步骤:

  • 预处理: 删除字符串两端的空格,检查第一个字符是否是符号(正号或负号)。
  • 提取数字: 从字符串中提取数字字符,直到遇到非数字字符。
  • 处理边界情况: 确保数字字符串在 32 位有符号整数范围内。
  • 类型转换: 将数字字符串转换为整数。

有用技巧

  • 使用 long long 数据类型: 避免整数溢出。
  • 考虑正负号: 提取数字时考虑符号影响。
  • 流式输入: 使用流式输入简化代码(例如,使用 C++ 中的 istringstream 类)。

代码示例

C++:

int myAtoi(string s) {
  // 预处理
  s = trim(s);
  if (s.empty()) return 0;
  int sign = 1;
  if (s[0] == '-' || s[0] == '+') {
    sign = (s[0] == '-') ? -1 : 1;
    s = s.substr(1);
  }

  // 提取数字
  string numStr;
  for (char c : s) {
    if (isdigit(c)) {
      numStr += c;
    } else {
      break;
    }
  }

  // 处理边界情况
  long long num = stoll(numStr);
  if (num * sign < INT_MIN) return INT_MIN;
  if (num * sign > INT_MAX) return INT_MAX;

  // 类型转换
  return num * sign;
}

Python:

def myAtoi(s):
  # 预处理
  s = s.strip()
  if not s: return 0
  sign = 1
  if s[0] in ('-', '+'):
    sign = -1 if s[0] == '-' else 1
    s = s[1:]

  # 提取数字
  numStr = ""
  for c in s:
    if c.isdigit():
      numStr += c
    else:
      break

  # 处理边界情况
  num = int(numStr)
  if num * sign < -2**31: return -2**  31
  if num * sign > 2**31 - 1: return 2**  31 - 1

  # 类型转换
  return num * sign

Java:

public int myAtoi(String s) {
  // 预处理
  s = s.trim();
  if (s.isEmpty()) return 0;
  int sign = 1;
  if (s.charAt(0) == '-' || s.charAt(0) == '+') {
    sign = (s.charAt(0) == '-') ? -1 : 1;
    s = s.substring(1);
  }

  // 提取数字
  StringBuilder numStr = new StringBuilder();
  for (char c : s.toCharArray()) {
    if (Character.isDigit(c)) {
      numStr.append(c);
    } else {
      break;
    }
  }

  // 处理边界情况
  long num = Long.parseLong(numStr.toString());
  if (num * sign < Integer.MIN_VALUE) return Integer.MIN_VALUE;
  if (num * sign > Integer.MAX_VALUE) return Integer.MAX_VALUE;

  // 类型转换
  return (int) (num * sign);
}

总结

理解字符串到整数转换的算法步骤和技巧,对解决 LeetCode 等编程问题至关重要。本文提供了详细的解释、代码示例和常见问题解答,帮助你轻松掌握这一重要概念。

常见问题解答

1. 如何处理含有非法字符的字符串?

忽略非法字符,只提取数字字符。

2. 如果数字字符串超出整数范围怎么办?

将其截断为最小/最大值。

3. 正负号如何影响结果?

在类型转换之前乘以符号(-1 或 1)。

4. 流式输入有什么优势?

简化了代码,允许逐步解析字符串。

5. 如何防止整数溢出?

使用 long long 数据类型来存储中间结果。