题目描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
思路
首先跳过空格找到第一个非空格字母,记录正负,若为‘+’或’-'则初始位置继续加一,循环产生连续数字,检测到非数字则跳出,中间循环检测是否越界
代码
方法一:
class Solution {
public:
int myAtoi(string str) {
int len = str.length();
if (len == 0)
return 0;
int start = 0;
bool positive = true;
while (str[start] == ' ')
{
start++;
if (start == len)
return 0;
}
if (str[start] == '-')
{
positive = false;
start++;
}
else if (str[start] == '+')
{
start++;
}
long long res = 0;
for (int i = start; i<len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
res = res * 10 + str[i] - '0';
}
else
break;
if (res - 1 >= INT_MAX)
{
if (positive == false)
return INT_MIN;
else
return INT_MAX;
}
}
if (positive == false)
return -res;
else
return res;
}
};
方法二:
class Solution {
public:
int myAtoi(string str) {
unsigned long len = str.length();
// 去除前导空格
int index = 0;
while (index < len) {
if (str[index] != ' ') {
break;
}
index++;
}
if (index == len) {
return 0;
}
int sign = 1;
// 处理第 1 个非空字符为正负符号,这两个判断需要写在一起
if (str[index] == '+') {
index++;
} else if (str[index] == '-') {
sign = -1;
index++;
}
// 根据题目限制,只能使用 int 类型
int res = 0;
while (index < len) {
char curChar = str[index];
if (curChar < '0' || curChar > '9') {
break;
}
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {
return INT_MIN;
}
res = res * 10 + sign * (curChar - '0');
index++;
}
return res;
}
};