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 }
    

      

     

  • 相关阅读:
    使用EntityFramework之Code First开发与MySql数据库问题一例
    使用Emit创建DBContext对象
    一个实用的Metro滚屏效果示例
    合理使用EntityFramework数据验证的异常错误提示信息
    Metro app中使用内存流压缩和解压
    64位的windows操作系统上运行32位asp.net web应用程序的时候,出现试图加载格式不正确的程序的解决方法
    VSTO中自定义XML功能区实现Ribbon控件互相更新
    基于任务并行库实现多线程下载示例
    Android系统刷机成功后网络信号显示“无服务”修正
    Solution Explorer中显示依赖文件和链接文件
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4381135.html
Copyright © 2011-2022 走看看