- 字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。题目已给出四点要求,依次解决即可
1.字符串前的空格要丢弃,若只有空格返回0
int start = 0;
while (start < s.length() && s[start] == ' ')
start++; // 前面空格位数
if (start == s.length())
return 0;
2.检查正负号,若无正负号默认为正数,前面已经排除了空格,直接检查下一位
int sign = 1; // 表示符号位,无符号也为正
if (s[start] == '-')
sign = -1, start++;
else if (s[start] == '+')
sign = 1, start++;
3.跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
for (int i = start; i < s.length() && isdigit(s[i]); i++) {
ans = ans * 10 + sign * (s[i] - '0');
if (ans > 0 && ans >= INT_MAX)
return INT_MAX;
if (ans < 0 && ans <= INT_MIN)
return INT_MIN;
}
// ans = ans * sign;
return ans;
4.溢出判断
在这卡了很久,本来准备最后一步再乘符号位,结果中间运算过程可能发生下溢,小于int 的表示范围,最后在运算中间加入符号然后判断上下溢即可
完整代码:
class Solution {
public:
int myAtoi(string s) {
long long ans = 0;
int start = 0;
while (start < s.length() && s[start] == ' ')
start++; // 前面空格位数
if (start == s.length())
return 0;
int sign = 1; // 表示符号位,无符号也为正
if (s[start] == '-')
sign = -1, start++;
else if (s[start] == '+')
sign = 1, start++;
for (int i = start; i < s.length() && isdigit(s[i]); i++) {
ans = ans * 10 + sign * (s[i] - '0');
if (ans > 0 && ans >= INT_MAX)
return INT_MAX;
if (ans < 0 && ans <= INT_MIN)
return INT_MIN;
}
// ans = ans * sign;
return ans;
}
};