49 把字符串转换成整数

题目要求:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

例如输入字符串"345",则输出整数345。

 

首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数。还是以"345"作为例子。当我们扫描到字符串的第一个字符'3'时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个数字'4'时,此时我们已经知道前面已经一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符'5',我们已经知道了'5'的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345

分析到这里,我们不能得出一个转换的思路:每扫描到一个字符,我们把在之前得到的数字乘以10再加上当前字符表示的数字。这个思路用循环不难实现。

由于整数可能不仅仅之含有数字,还有可能以'+'或者'-'开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。如果第一个字符是'+'号,则不需要做任何操作;如果第一个字符是'-'号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。

接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。

 

在ASCLL码中字符‘0’ 对应的编码是 48(十进制),依次’1’对应49,‘1’ ~ ‘9’对应48 ~ 57但是整数1就是等于1。

‘1’ - ‘0’ = 1,可以看做49 -48 =1;同理‘7’ - ‘0’ =7 ,对应 58 -49= 7;

 

思路:字符串转化为整数的方法num = num *  10 + str[i] - '0';
特殊情况:1、输入字符串为NULL;
2、输入字符串只有+/-;
3、转化的数字大于最大值或小于最小值;
4、输入的字符串有字母。
使用一个全局变量进行处理,因为非法情况需要返回0,但是字符串只有0时,也只能返回0,需要使用一个全局变量来进行辨别。
全部变量赋值技巧,首先赋值为true,进行程序就需要赋值为false,如果没有进行运算,说明是非法情况1、2,调用函数后,
如果是最大最小值退出的情况,全部变量也是false,只有正常处理完字符串遇到\0之后,才能修改全局变量,变为true。
上面这段话,我觉得讲得还挺好的,借鉴于 https://www.cnblogs.com/dingxiaoqiang/p/7499687.html
 1 public class Solution {
 2     public int StrToInt(String str) {
 3         //特殊情况处理
 4         if(str==null||str.length()==0){
 5             return 0;
 6         }
 7         //以下是一般情况,需要讨论
 8         //标志位sign的符号,是负数还是证书
 9         //除了标志位以外的字符char是否都是数字
10         //最终转换出数字后,有没有溢出Integer的最大值和最小值
11         char []  target = str.toCharArray();
12         int sign = 1; //标志位sign默认为1
13         //sign默认为1后,下面这行代码就可以不写了
14         //if(target[0]=='+'){sign=1;start=1;}
15         if(target[0]=='-') sign=-1;
16         //开始遍历
17         int result=0;
18         for(int i=(target[0]=='+' || target[0]=='-') ? 1 : 0;i<target.length;i++){
19             //只要char[]数组中,有一个不是数字就返回0,证明错误
20             if (!('0' <= target[i] && target[i] <= '9') ) return 0;
21             //经历if语句后,说明该位是数字
22             result = result * 10  + target[i] - '0';
23         }
24         //对溢出进行判断,若溢出,返回0,证明错误
25         if ((sign == 1 && result > Integer.MAX_VALUE) || (sign == -1 && result < Integer.MIN_VALUE)) {
26             return 0;
27         }
28         return sign*result;
29     }
30 }

 

posted @ 2019-07-20 10:25  淡如水94  阅读(301)  评论(0)    收藏  举报