在做leetcode的时候,又遇到这个百提不爽的问题,当时拿过题来,感觉那些情况我都知道的,然后就开始写。结果,还是很多没有注意到的,提交好几次才accept了,在此记录下,也与大家共享。
考虑情况:
-
- 首先,传入指针是否为空
- 字符串是否为空
- 包含+、-符号【但仅包含+、-为非法的】
- 是否会溢出(超出int表示范围)
- 是否包含非法字符【输出为可转换的还是输出0或者其他要看题意!由isLegal控制】
- 忽略最前面的空格
#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
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 {
isLegal = false;//表示含非法字符
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 }