您的位置:首页 > 其它

字符串转换为整数

2016-04-13 17:31 351 查看

题目


转换字符串到整数

实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。

样例

"10" =>10
"-1" => -1
"123123123123123" => 2147483647
"1.0" => 1

分析

该题目在LintCode上属于困难级别。主要是必须考虑全面,特别是要注意删除源串头尾无效字符以及判断合法性。

源码

/*
54 转换字符串到整数

实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。

样例
"10" =>10

"-1" => -1

"123123123123123" => 2147483647

"1.0" => 1
*/

class Solution {
public:
/**
* @param str: A string
* @return An integer
*/
int atoi(string str) {
// write your code here
if (str.empty())
{
return 0;
}//if
int len = str.length();
/*删除字符串开头多余的0*/
int beg = 0;
while (beg < len && (str[beg] == ' ' || str[beg] == '0'))
{
++beg;
}//while

/*删除字符串结尾多余的非数字字符*/
int end = beg + 1;
while (end < len && (str[end] >= '0' && str[end] <= '9'))
{
++end;
}//while

/*得到有效字符串*/
str = str.substr(beg, end - beg);
if (!isValid(str))
{
return 0;
}//if
len = str.length();

bool posi = str[0] == '-' ? false : true;
int minq = INT_MIN / 10, minr = INT_MIN % 10;

int sum = 0;
for (int i = (!posi || str[0] == '+') ? 1 : 0; i<len; ++i)
{
if (str[i] == '.')
{
break;
}//if

int num = '0' - str[i];
if ((sum < minq) || (sum == minq && num < minr))
{
/*溢出*/
return posi ? INT_MAX : INT_MIN;
}//if

sum = sum * 10 + num;
}//for

/*溢出*/
if (posi && sum == INT_MIN)
{
return INT_MAX;
}//if

return posi ? -sum : sum;
}

bool isValid(string str)
{
if (str.empty())
{
return true;
}//if

int len = str.length();
if ((str[0] != '-' && str[0] != '+') && (str[0] < '0' || str[0] > '9'))
{
return false;
}//if

if ((str[0] == '-' || str[0] == '+') && (len == 1 || str[0] == '0' || str[0] == '.'))
{
return false;
}//if

if (str[0] == '0' && len > 1)
{
return false;
}//if

for (int i = 1; i<len; ++i)
{
if ((str[i] < '0' || str[i] > '9') && (str[i] != '.'))
{
return false;
}//if

if (str[i] == '.' && (i + 1) == len)
{
return false;
}//elif

}//for
return true;

}
};
GitHub源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: