题解 | #把字符串转换成整数#
把字符串转换成整数
http://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e
题目难度:较难
题目考察:字符串转换
题目内容:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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; } };