题目描述
请你写一个函数StrToInt,实现把字符串转换成整数这个功能。
当然,不能使用atoi或者其他类似的库函数。
样例
输入:"123"
输出:123
注意:
你的函数应满足下列条件:
忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’
表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;
整数后可能有任意非数字字符,请将其忽略;
如果整数长度为0,则返回0;
如果整数大于INT_MAX(2^31 − 1),
请返回INT_MAX;如果整数小于INT_MIN(−2^31) ,请返回INT_MIN;
算法1
这个题目怎么说呢,语法题,面向测试用例编程,但是细节很多
需要将各个特殊情况考虑到,然后再不同的阶段中针对特殊情况处理,
但是处理的代码尽量不要互相干扰
首先是正负号,正号记录即可,但是不需要出现多次正号多次符号和同时出现正负号。
数字处理后出现正负号则不必处理
然后是考虑数值溢出问题,这里使用了longlong存储答案,
但是用例也可能丧心病狂的超过longlong的取值范围,
所以一旦发现超过了int的取值范围则不必继续处理了
第三 一旦开始进行处理数字后在遇到+-空格字母等 则直接不处理
第四 最后的数值计算完毕 根据有无’-‘字符 进行 负数
C++ 代码
class Solution {
public:
int strToInt(string s) {
if(s.empty()) return 0;
long long ans =0;
int l = 0;
while(s[l] == ' ')l++;
//取出多余空格
s = s.substr(l);
int posFlag=0; int negFlag= 0;
int numFlag=0;
//cout <<s<<endl;
for(int i = 0;i<s.size();i++){
//cout << "in " << s[i]<<endl;
if(s[i] =='-'){
if(negFlag==0&& posFlag==0&&numFlag==0) {negFlag=1;continue;}
else break;
}
if(s[i] =='+'){
if(posFlag ==0&&negFlag==0&&numFlag==0){ posFlag=1;continue;}
else break;
}
if(isdigit(s[i])){
if(ans > INT_MAX)break;
ans = ans*10+(s[i]-'0');
numFlag = 1;
}else{
break;
}
}
if(negFlag==1) ans = -ans;
ans = min(ans,(long long)INT_MAX);
ans = max(ans,(long long)INT_MIN);
return ans;
}
};