zoukankan      html  css  js  c++  java
  • 我的string_to_integer函数

      在做leetcode的时候,又遇到这个百提不爽的问题,当时拿过题来,感觉那些情况我都知道的,然后就开始写。结果,还是很多没有注意到的,提交好几次才accept了,在此记录下,也与大家共享。

      考虑情况:

      1. 首先,传入指针是否为空
      2. 字符串是否为空
      3. 包含+、-符号【但仅包含+、-为非法的】
      4. 是否会溢出(超出int表示范围)
      5. 是否包含非法字符【输出为可转换的还是输出0或者其他要看题意!由isLegal控制】          
      6. 忽略最前面的空格

      

    #include "stdafx.h"
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 bool isLegal = true;
     7 
     8 class Solution
     9 {
    10 public:
    11     int atoi(const char *str)
    12     {
    13         int  sum = 0;//空串返0
    14         const char *p = str;
    15         bool isNegative = false;//是否为负数
    16         //或者设为int sign = 1;为负时设为-1,返回sign*sum
    17         if(str == NULL)
    18         {
    19             isLegal = false;
    20             return 0;
    21         }
    22         //先过滤掉空格!!!
    23         while(*p==' '&&*p!='')//!!!
    24             p++;
    25 
    26         if(*p == '+')
    27         {
    28             //仅有“ +”不合法!!!
    29             p++;
    30             if(*p == '')
    31             {
    32                 isLegal = false;
    33                 return 0;
    34             }
    35         }
    36         else
    37         {
    38             if(*p == '-')
    39             {
    40                 //仅有“ -”不合法!!!
    41                 isNegative = true;
    42                 p++;
    43                 if(*p == '')
    44                 {
    45                     isLegal = false;
    46                     return 0;
    47                 }
    48             }
    49         }
    50 
    51         while(*p != '')
    52         {
    53             if(*p>='0' && *p<='9')
    54             {
    55                 
    56                 //计算之前判断:不在int表示范围内!!!
    57                 if(!isNegative)
    58                 {
    59                     if(sum>0x7fffffff/10 ||( sum==0x7fffffff/10 && (*p-'0') >= 0x7fffffff%10))
    60                         return 0x7fffffff;//最大最小值表示法!!!
    61                 }
    62                 else
    63                 {
    64                     if(sum>0x80000000/10 ||( sum==0x80000000/10 && (*p-'0') >= 0x80000000%10))
    65                         return (int)0x80000000;//最大最小值表示法!!!(0x不要漏掉了!!)
    66                 }
    67 
    68                 sum = sum*10+(*p-'0');
    69 
    70                 //    else
    71                 //        sum = sum + (*p-'0')*0.1;//计算方式不对!!
    72             }
    73             else
    74             {
                   isLegal = false;//表示含非法字符
    75                 break;//!!!返回可转换部分
    76             }
    77             p++;
    78         }
    79 
    80 
    81         return isNegative ? -sum : sum;
    82     }
    83 
    84 };
    85 
    86 int main()
    87 {
    88     Solution sol;
    89     cout << sol.atoi("-2147483647")<<endl;
    90     //“-123”,“”,NULL,“  213”,超过范围,“+”
    91     //不规则输入,但是有效:“-3924x8fc”、“+413”
    92     //边界:“-2147483647”“-2147483648”“2147483647”
    93     //无效格式:“++c”、“++1”
    94     //溢出数据“2147483648”“9223372036854775809”
    95 
    96 }
    

      

     

  • 相关阅读:
    查看git submodule更改
    /var/lib/docker空间占用过大迁移
    docker -修改容器
    docker重命名镜像repository和tag
    方法的重写、重载。
    方法的声明与使用。
    二维数组。
    标准输入输出流概述和输出语句。
    冒泡排序法。
    IO流,对象操作流优化。
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4381135.html
Copyright © 2011-2022 走看看