标签:
在做leetcode的时候,又遇到这个百提不爽的问题,当时拿过题来,感觉那些情况我都知道的,然后就开始写。结果,还是很多没有注意到的,提交好几次才accept了,在此记录下,也与大家共享。
考虑情况:
1 #include "stdafx.h" 2 #include <iostream> 3 4 using namespace std; 5 6 bool isLegal = true; 7 8 class Solution 9 { 10 public: 11 int atoi(const char *str) 12 { 13 int sum = 0;//空串返0 14 const char *p = str; 15 bool isNegative = false;//是否为负数 16 //或者设为int sign = 1;为负时设为-1,返回sign*sum 17 if(str == NULL) 18 { 19 isLegal = false; 20 return 0; 21 } 22 //先过滤掉空格!!! 23 while(*p==‘ ‘&&*p!=‘\0‘)//!!! 24 p++; 25 26 if(*p == ‘+‘) 27 { 28 //仅有“ +”不合法!!! 29 p++; 30 if(*p == ‘\0‘) 31 { 32 isLegal = false; 33 return 0; 34 } 35 } 36 else 37 { 38 if(*p == ‘-‘) 39 { 40 //仅有“ -”不合法!!! 41 isNegative = true; 42 p++; 43 if(*p == ‘\0‘) 44 { 45 isLegal = false; 46 return 0; 47 } 48 } 49 } 50 51 while(*p != ‘\0‘) 52 { 53 if(*p>=‘0‘ && *p<=‘9‘) 54 { 55 // if(!isDecimal)//不是小数!!! 56 //计算之前判断:不在int表示范围内!!! 57 if(!isNegative) 58 { 59 if(sum>0x7fffffff/10 ||( sum==0x7fffffff/10 && (*p-‘0‘) >= 0x7fffffff%10)) 60 return 0x7fffffff;//最大最小值表示法!!! 61 } 62 else 63 { 64 if(sum>0x80000000/10 ||( sum==0x80000000/10 && (*p-‘0‘) >= 0x80000000%10)) 65 return (int)0x80000000;//最大最小值表示法!!!(0x不要漏掉了!!) 66 } 67 68 sum = sum*10+(*p-‘0‘); 69 70 // else 71 // sum = sum + (*p-‘0‘)*0.1;//计算方式不对!! 72 } 73 else 74 { 75 break;//!!!返回可转换部分 76 } 77 p++; 78 } 79 80 81 return isNegative ? -sum : sum; 82 } 83 84 }; 85 86 int main() 87 { 88 Solution sol; 89 cout << sol.atoi("-2147483647")<<endl; 90 //“-123”,“”,NULL,“ 213”,超过范围,“+” 91 //不规则输入,但是有效:“-3924x8fc”、“+413” 92 //边界:“-2147483647”“-2147483648”“2147483647” 93 //无效格式:“++c”、“++1” 94 //溢出数据“2147483648”“9223372036854775809” 95 96 }
标签:
原文地址:http://www.cnblogs.com/dreamrun/p/4381135.html