zoukankan      html  css  js  c++  java
  • string to integer

     1 class Solution {
     2     public:
     3         //计算一个整数的位数,在溢出判断中使用
     4         int bit_length(int n)    {
     5             int l=0;
     6             while(n!=0){
     7                 l++;
     8                 n/=10;
     9             }
    10             return l;
    11         }
    12     int atoi(const char *str){
    13         if(*str=='') return 0;
    14         // 将开头的空白字符和0去掉
    15         while(isspace(*str) || *str-'0' ==0 )str++;
    16         int number=0;
    17         bool times_minus=false;//是否是负数
    18         bool symbol=false; //是否违法
    19         bool of=false;  //是否溢出
    20         while(*str!=''){
    21             //+号处理
    22             if(*str=='-')    {
    23                 if(((*(str+1)=='' )&&number!=0)|| !isdigit(*(str+1))){
    24                     symbol=true;
    25                     break;
    26                 }
    27                 times_minus=true;
    28             }
    29             //-号处理
    30             else if(*str=='+'){
    31                  if(((*(str+1)=='')&&number!=0) || !isdigit(*(str+1))){
    32                      symbol=true;
    33                      break;
    34                      
    35                  }
    36               }
    37             //数字处理
    38             else if(isdigit(*str)){   
    39                 if(*str-'0'==0 && number==0)
    40                 {}
    41                 else{
    42                     int num_copy=number;
    43                     number=number*10+*str-'0';
    44                     //溢出判断
    45                     if(bit_length(number)==bit_length(num_copy)){
    46                         of=true;
    47                     }
    48                 }
    49                 
    50             }
    51             //其他字符处理
    52             else 
    53                 break;
    54 
    55             str++;
    56         }    
    57     
    58         if(times_minus==true)
    59             number*=-1;
    60         //负溢出            
    61         if (( of&&times_minus==true )|| (number>0 && times_minus==true))
    62             number=-2147483648;
    63         //正溢出
    64         else if((of &&times_minus==false)|| (number<0 && times_minus==false))
    65             number=2147483647;
    66             
    67         if(symbol)
    68             return 0;
    69         else return number;
    70     }
    71 };

    将一个字符串转为一个整数本来是很简单的,但这里要处理的溢出的问题,关于整数的溢出可以参考CSAPP一书(汗,基本上参考的数目都是CSAPP、SICP、CLRS。。。不过这几本书都是神书级别,看了就会有很大提高的好书)。
    题目要求

    1. 字符串开头可以有空白字符;

    2. 字符串里面出现不合法的字符就从这个截断;

    3. +号和负号只能出现在数字的开头,且只有一个;

    4. 数字溢出后按照32位整数表示来处理;这一步是重点,我结合了位数变换和操作数的符号来综合判断。

    5. 数字开头可能有0,也需要滤去

  • 相关阅读:
    系统设计实现
    反编译
    android layout analyze
    2016.7.20-notes
    如何认识刘昊然?
    leetcode-中等-队列-二叉树的层次遍历
    leetcode-简单-栈-逆波兰表达式
    leetcode-简单-栈-有效的括号
    队列-链式队列
    队列-循环队列-顺序存储
  • 原文地址:https://www.cnblogs.com/gaoduan/p/4055370.html
Copyright © 2011-2022 走看看