一个简单模拟写了50分钟 。。错了5次。。没谁了
(1/6) 准确率16%...哎(好像正好和题目的准确率一样...)【大哥求你细心点!!!!】
执行用时 : 8 ms, 在String to Integer (atoi)的C++提交中击败了95.34% 的用户
内存消耗 : 8.6 MB, 在String to Integer (atoi)的C++提交中击败了76.54% 的用户
class Solution {
public:int myAtoi(string str) {//多种情况//注意正号!!!int sz=str.size(),i=0;while(i<sz&&str[i]==' '){i++;}if(i==sz||((str[i]!='-'&&str[i]!='+')&&(str[i]>'9'||str[i]<'0'))) return 0;//空串 or 无效(非正负号开头,0-9)string s="";if(str[i]=='-') //负数{s+='-';i++;if(i==sz) return 0;if(!(str[i]<='9'&&str[i]>='0')) return 0;//无效}else if(str[i]=='+') //特殊{i++;if(i==sz) return 0;if(!(str[i]<='9'&&str[i]>='0')) return 0;//无效}int is_0=1;//是否属于前导0while(str[i]<='9'&&str[i]>='0'&&i<sz){if(str[i]!='0'){s+=str[i];is_0=0;}if(str[i]=='0'&&is_0==0)s+=str[i]; i++; }if(s[0]=='-'&&s.size()==1) return 0;//只有一个-if(s.size()==0) return 0;int max1=INT_MAX;int min1=INT_MIN;string max2,min2;stringstream ss;ss<<max1;ss>>max2;stringstream sss;sss<<min1;sss>>min2;if(s[0]=='-') {if(s.size()>min2.size())return INT_MIN;}else if(s.size()>max2.size()) return INT_MAX;stringstream ans;ans<<s;long long tmp;ans>>tmp;if(tmp<INT_MIN) return INT_MIN;if(tmp>INT_MAX) return INT_MAX;return tmp;}
};
膜拜一下某位大佬的简洁版本:
class Solution {
public:int myAtoi(string str) {int i=0;long res=0;int sign=1;while(i<str.size() && str[i]==' ') ++i;if(i == str.size()) return 0;if(str[i]=='-') {sign=-1;i++;}else if(str[i]=='+') i++; while(i<str.size() && isdigit(str[i])){res=res*10+(str[i++]-'0');if(res>INT_MAX){if(sign==1) return INT_MAX;else return INT_MIN;}}return res*sign;}
};
//作者:li-ming-hui-2
相比于我的代码,他的优点:
直接用res代表了最后结果输出的一部分:// return res*sign;
这样的好处显而易见:最主要的原因是来自于:
while(i<str.size() && isdigit(str[i])){res=res*10+(str[i++]-'0');if(res>INT_MAX){if(sign==1) return INT_MAX;else return INT_MIN;}}
他在中间进行判断,而不是和我一样用stringstream完成后先用长度筛选,再用long long 赋值。及时止损,防止溢出。
这样以来节省了很多事。
特别是这一句:
if(res>INT_MAX){if(sign==1) return INT_MAX;else return INT_MIN;
这个地方,用res和INT_MAX 比较。虽然看似忽略了一点:
INT_MAX: (2^31 ? 1) ;
INT_MIN : (?2^31);
绝对值是不同的。所以这样的判定看似太粗糙。
但仔细想想:当res>INT_MAX的时候,是不是最小就是INT_MAX+1,也就是INT_MIN的相反数?所以这是没问题的。