标签:
这题写的好惨啊,各种情况
1、丢弃前面空白和数字后面东西
2、数字是会连续输入的或者是和符号一起输出的,中间有其他的字符都会视为无效,数字前有其他字符也会视为无效。
3、0777视为777的,注意整数溢出。
1 class Solution { 2 public: 3 int myAtoi(string str) { 4 if(str.empty()) return 0; 5 string::iterator first=str.begin(),end=str.end(); 6 int n=0,op_tag=0,num_tag=0,space_tag=0; 7 long long max=2147483647,num=0; 8 char op=‘+‘; 9 while(first!=end) 10 { 11 while(*first==‘ ‘){first++;space_tag=1;} 12 if(*first==‘+‘||*first==‘-‘ ) 13 { 14 if(op_tag==0) 15 { 16 op=*first; 17 op_tag=1; 18 first++; 19 20 } 21 else return 0; 22 } 23 if((first != end) &&isdigit(*first)) 24 { 25 while((first != end) && isdigit(*first)) 26 { 27 n=*first-‘0‘; 28 num=num*10+n; 29 first++; 30 num_tag=1; 31 if(num > max)break; 32 } 33 } 34 else break; 35 if(num_tag==1||space_tag==1||op_tag==1) break; 36 first++; 37 } 38 if(op==‘-‘) 39 { 40 if(num >(max+1))num =-(max+1); 41 else num=-num; 42 } 43 else if(op== ‘+‘) 44 { 45 if(num>max) num=max; 46 } 47 return num; 48 49 } 50 };
如果把指针改为下标会简练一些,下面是网上的思路
1 int atoi(const char *str) { 2 int sign = 1, base = 0, i = 0; 3 while (str[i] == ‘ ‘) { i++; } 4 if (str[i] == ‘-‘ || str[i] == ‘+‘) { 5 sign = 1 - 2 * (str[i++] == ‘-‘); 6 } 7 while (str[i] >= ‘0‘ && str[i] <= ‘9‘) { 8 if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - ‘0‘ > 7)) { 9 if (sign == 1) return INT_MAX; 10 else return INT_MIN; 11 } 12 base = 10 * base + (str[i++] - ‘0‘); 13 } 14 return base * sign; 15 }
标签:
原文地址:http://www.cnblogs.com/daocaorenblog/p/4977832.html