题目难度:较难
题目考察:字符串转换
题目内容:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
题目分析:首先这题我看到标的是困难就有点奇怪,这应该是一个水题,然后轻松过掉了,发现题解里写了一堆啥越界问题,我去某地方看这道题才发现要考虑各种临界数据。。。
首先先不考虑边界问题,将字符串转换为数字应该怎么转换,若从左向右遍历数字,设当前位字符为c,数字结果为res,则数字拼接公式为:
这实际上是容易理解的,这题的难点在于各种边界问题,可以怎么考虑呢,long long !!!,哎这就很方便了,不存在什么边界问题,这题并没有告诉你越界了输出什么。。。如果要输出-1什么的都可以通过判断最终的值来考虑是否越界
下面给出代码
算法1(long long)
class Solution {
public:
int StrToInt(string str) {
if(str.size()==0)return 0;
long long ans=0
//注意用long long来考虑边界问题
int k=1;
//k判断正负号
if(str[0]=='+')ans=0;
else if(str[0]=='-')k=-1;
else ans=str[0]-'0';
//判断第一个数是数字或者是符号
for(int i=1;i<str.size();i++) if(str[i]>='0'&&str[i]<='9')
ans=ans*10+(str[i]-'0');
else return 0;
return (int)(ans*k);
//这里题目如果要考虑越界可以用long long的ans来判断是否越界
}
};算法2:
很明显这题的本意是不想让你用long long的而是想考虑细节的处理,这题的细节在于整数的溢出,在什么地方会溢出
1.res10
*2.**res+str-'0'
也就是说只要判断了这里就能避免溢出情况
下面给出代码
class Solution {
public:
int strToInt(string str) {
int i = 0;
bool sign=false;
//提取+,-符号。
if(str[i] == '-'){
sign=true;
++i;
}else if(str[i] == '+'){
++i;
}
int ans = 0;
//提取整数部分。累加过程中,如果正数 > INT_MAX时,返回INT_MAX. 如果负数 < INT_MIN时,返回INT_MIN.
while(i < str.size() && isdigit(str[i])){
ans = ans*10 +(str[i] - '0');
if(!sign && ans > INT_MAX){
return INT_MAX;
}else if(sign && -ans < INT_MIN){
return INT_MIN;
}
++i;
}
return sign ? -ans : ans;
}
};
京公网安备 11010502036488号