LeetCode 第8题:字符串转换整数 (atoi)
题目描述
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数。函数myAtoi(string s)的算法需要按照以下步骤:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符是否为正负号,读取该字符(如果有)
- 读取数字字符,直到遇到非数字字符或到达字符串末尾
- 将前面读入的字符转换为整数,如果没有读入数字,则值为0
- 如果整数超过32位有符号整数范围[-2^31,2^31 -1],需要截断这个整数
难度:中等
题目链接:8. 字符串转换整数 (atoi) - 力扣(LeetCode)
示例一:
输入:s = "42" 输出:42 解释: 第 1 步:"42"(当前没有读入字符,因为没有前导空格) 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') 第 3 步:"42"(读入 "42")
示例二:
输入:s = " -42" 输出:-42 解释: 第 1 步:" -42"(读入前导空格,但忽视掉) 第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数) 第 3 步:" -42"(读入 "42")
示例三:
输入:s = "4193 with words" 输出:4193 解释:转换截止于数字 '3' ,因为它的下一个字符不为数字
提示
- 0 <= s.length <= 200
- s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
方法:模拟法
注意点:
- 状态机思想:
- 处理空格状态
- 处理符号状态
- 处理数字状态
- 处理结束状态
- 边界处理:
- 整数范围检查
- 符号处理
- 非法字符处理
- 溢出处理
- 在加入新的数字前检查是否会溢出
- 使用long类型暂存结果
时间复杂度:O(n),其中n是字符串长度。
空间复杂度:O(1)。
public class Solution //读题得最终转换为一个数字 { public int MyAtoi(string s) { int i=0,n=s.Length; while(i<n && s[i]==' ') i++; //如果是空格,跳过 int sign=1; if(i<n && s[i] == '+' || s[i] =='-') { sign = s[i] =='+' ? 1:-1;//定义加减符号,加号为1,减号为-1 i++; } long result = 0; while(i<n && char.IsDigit(s[i])) { result = result*10+(s[i]-'0');//考虑了进位10,然后后续加数 \\处理溢出 if(sign==1 && result >int.MaxValue) return int.MaxValue; if(sign==-1 && result<int.MinValue) return int.MinValue; i++; } return (int)(sign*result); } }