思路
方法:模拟
本题难点在于怎么判断数字是否超过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)