这种题的考察重点并不在于问题本身,而是要注意corner case的处理,整数一般有两点,一个是正负符号问题,另一个是整数越界问题。思路比较简单,就是先去掉多余的空格字符,然后读符号(注意正负号都有可能,也有可能没有符号),接下来按顺序读数字,结束条件有三种情况:(1)异常字符出现(按照C语言的标准是把异常字符起的后面全部截去,保留前面的部分作为结果);(2)数字越界(返回最接近的整数);(3)字符串结束。
思路:从头开始查找字符,找打标志位,然后开始计算
#include <iostream>
#include <vector>
#include <string>
#include <limits>
using namespace std;
/*
这里需要注意三点 一个越界 一个正负数 一个字符串结束
*/
int StringToInt(string& str)
{
if(str.length()==0)
return 0;
int i;
int flag=1;
int result=0;
int digit;
for(i=0;i<str.length();i++)
if(str[i] != ' ')
break;
if(str[i]=='+')
i++;
if(str[i]=='-')
{
flag = 0;
i++;
}
for(;i<str.length();i++)
{
if(str[i]<'0' || str[i]>'9')
break;
digit = str[i]-'0';
if(flag && (numeric_limits<int>::max()-result*10) <= digit)
return numeric_limits<int>::max();
else if(!flag && (numeric_limits<int>::min()+result*10) >= digit*-1)
return numeric_limits<int>::min();
result = result*10 + digit;
}
return flag == 1? result:-result;
}
int main()
{
string str("2147483649");
cout<<StringToInt(str)<<endl;
return 0;
}
String to Integer (atoi)--LeetCode
原文地址:http://blog.csdn.net/yusiguyuan/article/details/44902789