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;}};
- leetCode 之 String to Integer (atoi)
- leetcode 之 String to Integer (atoi)
- leetcode 之 String to Integer (atoi)
- leetcode之String to Integer (atoi)
- LeetCode之String to Integer(atoi)
- Leetcode之String to Integer (atoi)
- 【Leetcode】之String to Integer (atoi)
- LeetCode之8----String to Integer (atoi)
- LeetCode 之 String to Integer (atoi)
- LeetCode:String to Integer (atoi)
- LeetCode: String to Integer (atoi)
- LeetCode String to Integer(atoi)
- LeetCode :String to Integer (atoi)
- Leetcode: String to Integer (atoi)
- Leetcode : String to Integer (atoi)
- 【leetcode】String to Integer (atoi)
- [LeetCode]String to Integer (atoi)
- LeetCode-String to Integer (atoi)
- 04 Java API:arraylist实现算术表达式的解析
- Unrecognized Windows Sockets error: 0: JVM_Bind
- 计算机组成原理基础
- Android 操作SQLite数据库(初步)-在程序中删除数据库
- EL表达式和OGNL表达式的区别和联系
- leetCode 之 String to Integer (atoi)
- C++ Primer之最佳实践
- SIP Trunk是什么
- 擅长排列的小明
- VC6编辑的程序在Win7下运行时获取管理权限
- 用Android 开发的一个加法计算器
- JPA的persistence.xml文件
- Node.js开发手册(四)-Redis数据库访问
- C++课程设计 — 公司设备管理系统