首页 > 其他 > 详细

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

时间:2020-11-16 14:49:38      阅读:30      评论:0      收藏:0      [点我收藏+]

技术分享图片

思路

方法:模拟

技术分享图片

 

本题难点在于怎么判断数字是否超过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. 把字符串转换成整数(数字越界处理,清晰图解)

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

原文:https://www.cnblogs.com/FengZeng666/p/13984467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!