这种题的考察重点并不在于问题本身,而是要注意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