zoukankan      html  css  js  c++  java
  • 剑指 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. 把字符串转换成整数(数字越界处理,清晰图解)

  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13984467.html
Copyright © 2011-2022 走看看