8. String to Integer (atoi)
题目
将字符串转换为整数。
1.首先将遇到的空格舍弃,直到遇到首个非空字符。
2.然后,选择正负号,将字符串翻译成数值。
字符串可以包含构成整数的字符之后的其他字符,这些字符被忽略,对函数没有影响。
Input: “4193 with words”
Output: 4193
3.如果str中的非空字符的第一个序列不是一个有效的整数,或者如果没有这样的序列存在,当str是空的,或者它只包含空白字符,那么就不会执行转换。
如果没有有效的转换,就返回零。
Input: “words and 987”
Output: 0
4.如果越界,返回边界值(2147483647或-2147483648)
int是32bit,范围 [−231, 231− 1]
INT_MAX (231− 1) or INT_MIN (−231) is returned.
Input: “-91283472332”
Output: -2147483648
代码块
class Solution {
public int myAtoi(String str) {
if(str.length() == 0|| str == null)
return 0;
int sign = 1;
int index = 0;
long result = 0;
while(index < str.length() && str.charAt(index) == ' '){//当全为空的时候,index=str.length(),下面的if和for就都不会执行了.
index ++;
}
if(index < str.length()){//加一个大条件
if(str.charAt(index) == '-'){
sign = -1;
index ++;
}else if(str.charAt(index) == '+'){
index ++;
}
}
for(int j = index; j < str.length(); j++){
if(str.charAt(j) >= '0' && str.charAt(j) <= '9'){
result = result *10 + str.charAt(j) - '0';
if(result > java.lang.Integer.MAX_VALUE){
return sign <0 ?(java.lang.Integer.MIN_VALUE):(java.lang.Integer.MAX_VALUE);
// if(result > java.lang.Long.MAX_VALUE){
// return (int)( ***sign<'0'***?(java.lang.Long.MIN_VALUE):(java.lang.Long.MAX_VALUE)); sign是int型,不加引号。
}
}else{
break;
}
}
result *= sign;
return (int)result;
}
public static void main(String[] args) {
//String str = "2147483648";
String str = " 1";
System.out.println(myAtoi(str));
}
}
代码分析
本题需要考虑几种情况:
1. 如果为空或者长度为零时,返回0;
str=null 说明str没有指向任何对象 ;而str长度为零时str肯定不为null的,此时str指向一个长度为零的字符串。
2. 如果遇到空格就将索引往后移;(while)
3. 判断符号;(是正是负)
4. 判断数字是否在0-9;再判断数值是否越界
5. 将数值乘字符表示出来。
本题的条件二(while)控制了str全为空的情况,当全为空的时候,index=str.length(),下面的if和for就都不会执行了。
java.lang.Integer.MAX_VALUE 表示Java中int型最大值。
空格的ASCII为32;’0’的ASCII码为48。
![](https://i-blog.csdnimg.cn/blog_migrate/e2f20bec0d1045d2e42ae353f7f9e41d.jpeg)
Figure 1. ASCII