leetCode 之 String to Integer (atoi)

来源:互联网 发布:老虎证券开户 知乎 编辑:程序博客网 时间:2024/05/16 19:31

原题:

Implement atoi to convert a string to an integer.

题目很好理解,就是把一个字符串转成一个int,主要是有这么几种情况要考虑:

1 正负号

2 空格

3 字母  123a44,这种,就返回123;a123,就返回0

4 溢出   int保存的范围是 -2147483648   ~  2147483647 , 如果正数溢出,就返回正数的最大值;负数溢出,就是负数的最小值

int范围:

一个int是4个字节,共32位,第一个位是符号位,则共有31位有效位,则最大值为2^0+2^1+.......2^30 = 2^31-1=2147483648   

而int的负数一般采用补码表示,其最小值为-2147483648 (用的-0的表示方法)

int的补码表示,正数和负数差一个数,这个就差在0上,从常理上讲,+0和-0是一样的,但是如果用补码表示的话,+0还是0,而-0就是1000000000000,但是补码中,这个-0就是比正数多出来的那一个,就是最小的INT_MIN,32位就是

  -2147483648,这个需要牢记。原来的负数都要取反加一,用原码的形式来表示,而 -2147483648  就是一个没有原码的数字,只有一个10000000000这个补码表示,其实只要记住补码表示中,负数比正数多一个,多的一个必然就是用“-0”来表示的。。。。其他的可以看看我的这篇博客int的范围

有了上述的,做这个题就容易多了,解题思路:

1 先用while检测第一个非空的字符,如果是字母,直接返回0,如果是-,用一个num来标记符号,1为正,-1为负,用result表示这个数的绝对值,最后返回的结果就是result*num;

2 当检测的是非第一个字符时,需要检测是否是字母,因为每个char都是int,所以'0'和'9'之间的char就是数字,如果是数字,就把以前的result*10加上当前检测的这个字符,记住要减去'0';

3 在进行2时,需要判断是否要越界,因为int的正数和负数的界限不一样,需要分别讨论,

  1)正数,如果result(这个result还没有加上当前的字符)比INT_MAX/10小,比如当前的result为214748364,而下一个为9,就溢出了,所以在把这个9附在result后之前,要判断一下:1 这个result是不是比INT_MAX/10大,如果比它它,则乘以10后直接溢出;2 如果比它小,则乘以10后,再加上这个9,就不会溢出,正常处理 ; 3 如果和它一样,需要考虑两个特殊情况:这个数为8或9都会溢出;这几种溢出的情况都要返回INT_MAX;

 2)负数,和正数基本一致,只要情况3不一样,因为负数的数字比正数多一个,-2147483648不会溢出,而-2147483649会溢出,所以如果INT_MAX/10和result相等时,只要这个字符不是'9'就行

4 以后看到字符和数字转化时,要记住*str-'0'这个式子,而且str++就可以把指针挨个向后移位。


代码如下(88ms):

class Solution {public:    int atoi(const char *str) {       // char temp = *str;        //if        int result = 0;        int num =1;        while(*str){            if(*str>='0'&&*str<='9'){               result = result*10+*str-'0';                   }            else if( *str=='-'){            num = -1;            }            else if( *str=='+'){            num = 1;            }            else if(*str==' '){            str++;            continue;            }            else{            return 0;            }            str++;            break;        }                while(*str){            if(*str>='0'&&*str<='9'){            if(num>0){            if( (INT_MAX/10 ==result && *str-'0'>=8&&*str-'0'<=9 ) || result>INT_MAX/10 )             return INT_MAX;             else                    result = result*10+*str-'0';                         }             else{            if( (INT_MAX/10 == result && *str-'0' ==9)  ||result>INT_MAX/10 )             return INT_MIN;             else             result = result*10+*str-'0';                         }                                     }            else{            break;            }             str++;        }//        if(num==1){//            if(num*result<0) result = INT_MAX;//        }//        else{//            if(num*result>0) result = INT_MIN;//        }                return result*num;}};

0 0
原创粉丝点击