Loading

剑指 Offer 67. 把字符串转换成整数

思路

方法:模拟

 

本题难点在于怎么判断数字是否超过int的范围,这里有两个方法解决:

(1) 使用long long直接判断

 1 class Solution {
 2 public:
 3     int strToInt(string str) {
 4         if(str.empty()) 
 5             return 0;
 6 
 7         int firstValidPos = 0;  //第一个非空格符的下标
 8         while(str[firstValidPos] == ' ') {
 9             ++firstValidPos;
10             if(firstValidPos >= str.size())
11                 return 0;
12         }
13 
14         int lastValidPos = 0;   //最后一个合法的下标
15         long long num = 0;      //使用long long直接判断是否越界
16         if(isdigit(str[firstValidPos])) {
17             lastValidPos = firstValidPos+1;
18             while(isdigit(str[lastValidPos])){
19                 ++lastValidPos;
20             }
21             --lastValidPos;
22 
23             num = str[firstValidPos] - '0';
24             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
25                 num = num*10 + (str[i]-'0');
26                 if(num > 2147483647) 
27                     return 2147483647;
28             }
29 
30         } else if(str[firstValidPos] == '+') {
31             firstValidPos += 1;
32             if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) {
33                 return 0;
34             }
35 
36             lastValidPos = firstValidPos+1;
37             while(isdigit(str[lastValidPos])){
38                 ++lastValidPos;
39             }
40             --lastValidPos;
41 
42             num = str[firstValidPos] - '0';
43             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
44                 num = num*10 + (str[i]-'0');
45                 if(num > 2147483647) 
46                     return 2147483647;
47                 
48             }
49 
50 
51         } else if(str[firstValidPos] == '-') {
52             firstValidPos += 1;
53             if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) {
54                 return 0;
55             }
56 
57             lastValidPos = firstValidPos+1;
58             while(isdigit(str[lastValidPos])){
59                 ++lastValidPos;
60             }
61             --lastValidPos;
62             
63             num = str[firstValidPos] - '0';
64             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
65                 num = num*10 + (str[i]-'0');
66                 if(num >= 2147483648) 
67                     return -2147483648;
68                 
69             }
70             num = -num;
71         } // else return num;
72 
73         return num;
74 
75     }
76 };

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

 

(2) 提前判断

 1 class Solution {
 2 public:
 3     int strToInt(string str) {
 4         if(str.empty())
 5             return 0;
 6 
 7         int firstValidPos = 0;  //第一个非空格符的下标
 8         while(str[firstValidPos] == ' ') {
 9             ++firstValidPos;
10             if(firstValidPos >= str.size())
11                 return 0;
12         }
13 
14         int lastValidPos = 0;   //最后一个合法的下标
15         int num = 0;            //使用int,则后面要提前判断是否越界
16         if(isdigit(str[firstValidPos])) {
17             lastValidPos = firstValidPos+1;
18             while(isdigit(str[lastValidPos])){
19                 ++lastValidPos;
20             }
21             --lastValidPos;
22 
23             num = str[firstValidPos] - '0';
24             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
25                 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7))
26                     return 2147483647;
27 
28                 num = num*10 + (str[i]-'0');
29             }
30 
31         } else if(str[firstValidPos] == '+') {
32             firstValidPos += 1;
33             if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) {
34                 return 0;
35             }
36 
37             lastValidPos = firstValidPos+1;
38             while(isdigit(str[lastValidPos])){
39                 ++lastValidPos;
40             }
41             --lastValidPos;
42 
43             num = str[firstValidPos] - '0';
44             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
45                 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7))
46                     return 2147483647;
47 
48                 num = num*10 + (str[i]-'0');
49             }
50 
51 
52         } else if(str[firstValidPos] == '-') {
53             firstValidPos += 1;
54             if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) {
55                 return 0;
56             }
57 
58             lastValidPos = firstValidPos+1;
59             while(isdigit(str[lastValidPos])){
60                 ++lastValidPos;
61             }
62             --lastValidPos;
63 
64             num = str[firstValidPos] - '0';
65             for(int i = firstValidPos+1; i <= lastValidPos; ++i) {
66                 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7))
67                     return -2147483648;
68 
69                 num = num*10 + (str[i]-'0');
70             }
71             num = -num;
72         } // else return num;
73 
74         return num;
75 
76     }
77 };

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

 

参考

面试题67. 把字符串转换成整数(数字越界处理,清晰图解)

posted @ 2020-11-16 12:12  拾月凄辰  阅读(128)  评论(0编辑  收藏  举报