跳到主要内容

字符串转换整数 (atoi)

题目描述

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。


函数 myAtoi(string s) 的算法如下:

  1. 空格:读入字符串并丢弃无用的前导空格(" "
  2. 符号:检查下一个字符(假设还未到字符末尾)为 - 还是 +。如果两者都不存在,则假定结果为正。
  3. 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0
  4. 舍入:如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被舍入为 −2^31 ,大于 2^31 − 1 的整数应该被舍入为 2^31 − 1

返回整数作为最终结果。

示例

输入:s = "42"
输出:42

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.' 组成

解题思路

模拟转换过程

  1. 读取并丢弃前导空格
  2. 读取符号
  3. 读取数字并转换为整数
  4. 检查是否越界并进行处理

时间复杂度:O(n) 空间复杂度:O(1)

C++ 解法

#include <string>

class Solution {
public:
int myAtoi(std::string s) {
int length = s.length();
int index = 0;

// 检查空格
while (index < length && s[index] == ' ') {
index++;
}

if (index == length) return 0; // 所有字符都是空格

// 检查符号位
int sign = 1;
if (s[index] == '-' || s[index] == '+') {
sign = (s[index] == '-') ? -1 : 1;
index++;
}

// 检查数字并计算结果
long long result = 0;
while (index < length && isdigit(s[index])) {
int digit = s[index] - '0'; // 字符转换为数字

// 检查是否超过整数范围
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > INT_MAX % 10)) {
return (sign == 1) ? INT_MAX : INT_MIN;
}

result = result * 10 + digit;
index++;
}

return static_cast<int>(result * sign);
}
};

LeetCode链接: 7. 整数反转