题目大意:给定一个字符串,要求将字符串转换成整型。
理解:本题需要考虑到很多种情况:
1)字符串为null或为空串或字符串中全为空格字符,返回0;
2)字符串开始部分为空串,如“ 123”,返回数字部分;
3)字符串中包含非数字,如“+123a45b87”,返回第一个非数字前的有效数字部分;
4)字符串中同时包含以上多种情况,如“ -23d456”。
先把空格除去,再考虑正负号,扫描的过程中,同时考虑是否溢出(上、下溢),当遇到非法字符时,返回当前得到的有效数字。
实现:
public class Solution {
public int atoi(String str) {
if(str == null || str.length() == 0) return 0;
int len = str.length();
long res = 0;
int tag = 1, i = 0; // tag标记正负号
while(i < len && str.charAt(i) == ' ') i ++; // 除去空格
if(i == len) return 0; // 全为空格的情况
else if(str.charAt(i) == '-') { // 负号
tag = -1;
i ++;
}
else if(str.charAt(i) == '+') { // 正号
i ++;
}
while(i < len) {
if(str.charAt(i) < '0' || str.charAt(i) > '9') { // 碰到第一个非法字符,返回现在有效的数字
return (int)res;
}
res = res * 10 + tag * (str.charAt(i) - '0'); // 乘以tag,区分正负数
if(res > Integer.MAX_VALUE) return Integer.MAX_VALUE; // 上溢出时,返回最大整数
else if(res < Integer.MIN_VALUE) return Integer.MIN_VALUE; // 下溢出时,返回最小整数
i ++;
}
int num = (int)res;
return num;
}
}