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

  • 相关阅读:
    .NET开源系统
    DEDEcms二次开发数据表参数
    dede系统的pagebreak文章页面分页数量控制方法
    窗口最小化到托盘
    SEO项目各个阶段的工作分配
    scrollTop
    去除行内块间的间距
    jquery mobile
    nodejs学习
    cancelAnimationFrame无效
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13984467.html
Copyright © 2020-2023  润新知