/*
问题描述:实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。
来源:LintCode
作者:syt
问题描述:实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。
来源:LintCode
作者:syt
日期:2017-9-15
思路:方法1 atoi1是一开始写的,思路比较乱,方法2,整理思路重新编码,认真读题可以理清一些思路,题目要求是整数,所以不用考虑小数点后的数字,需要考虑的情况比较多,首先字符串去空格,遍历字符串取出合法整数并判断正负,需要注意INT_MAX和INT_MIN值不相同,具体代码见atoi2()
*/
#include <iostream>
#include <string>
using namespace std;
/*
* @param str: A string
* @return: An integer
*/
int atoi2(string &str)
{
if (str == "")
return 0;
//去空格
int index = 0;
if (!str.empty())
{
while ((index = str.find(' ', index)) != string::npos)
{
str.erase(index, 1);
}
}
int len = str.length();
bool isSign = false;
bool isNeg = false;
string number = "";
for (int i = 0; i < len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
number = number + to_string(str[i] - '0');
}
else if (str[i] == '+' || str[i] == '-')
{
if (number != "")
{
break;
}
if (isSign)
return 0;
isSign = true;
if (str[i] == '-')
isNeg = true;
}
else
break;
}
bool isOut = false; //越界
string max = "";
if (isNeg)
{
string tmp = to_string(INT_MIN);
max = tmp.substr(1, tmp.length());
}
else
max = to_string(INT_MAX);
if (number.length() > max.length())
isOut = true;
else if (number.length() == max.length())
{
if (number > max)
isOut = true;
}
//是否越界
if (isOut)
{
if (isNeg)
return INT_MIN;
else
return INT_MAX;
}
int val = 0;
//计算数值
for (int i = 0; i < number.length(); i++)
{
if (number[i] >= '0' && number[i] <= '9')
{
int tmp = number[i] - '0';
val = val * 10 + tmp;
}
}
//判断是否为负数
if (isNeg)
return -val;
return val;
}
int atoi1(string &str) {
// write your code here
if (str == "")
return 0;
int len = str.length();
int index = 0;
int lindex = str.length();
int pointIndex = 0;
bool isFloat = false;
string floatStr = "";
bool isNeg = false;
bool isPos = false;
int opIndex = 0;
int numIndex = -1;
for (int i = 0; i < len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
numIndex = i;
}
else if (str[i] < '0' || str[i] > '9')
{
if ((str[i] == '-' || str[i] == '+'))
{
if (numIndex != -1)
{
lindex = i;
break;
}
if (str[i] == '+')
isPos = true;
if (str[i] == '-')
isNeg = true;
if (isNeg && isPos)
return 0;
opIndex = i;
continue;
}
else if (str[i] == '.' && !isFloat)
{
isFloat = true;
pointIndex = i;
continue;
}
else if (str[i] == ' ')
{
if (numIndex != -1)
{
lindex = i;
break;
}
index++;
}
else
{
lindex = i;
break;
}
}
}
string max = to_string(INT_MAX);
string strs = "";
if (isNeg)
{
string tmp = "";
//是负数
if (isFloat)
{
tmp = str.substr(index + 1, pointIndex - 1);
floatStr = str.substr(pointIndex + 1, lindex);
}
else
{
tmp = str.substr(index + 1, lindex - index - 1);
}
if (tmp.length() > max.length())
return INT_MIN;
else if (tmp.length() == max.length())
{
if (tmp > max)
return INT_MIN;
}
strs = tmp;
}
else
{
//不是负数
string tmp = "";
if (isFloat)
{
tmp = str.substr(index, pointIndex);
floatStr = str.substr(pointIndex + 1, lindex);
}
else
{
tmp = str.substr(index, lindex - index);
}
if (tmp.length() > max.length())
return INT_MAX;
else if (tmp.length() == max.length())
{
if (tmp > max)
return INT_MAX;
}
strs = tmp;
}
int val = 0;
for (int i = 0; i < strs.length(); i++)
{
if (strs[i] >= '0' && strs[i] <= '9')
{
int tmp = strs[i] - '0';
val = val * 10 + tmp;
}
}
if (isFloat)
{
for (int i = 0; i < floatStr.length(); i++)
if (floatStr[i] != '0')
return 0;
}
if (isNeg)
if (str[opIndex] == '-')
return -val;
return val;
}