leetcode8 字符串转换整数
/**
* leetcode8 字符串转换整数
*
* 难度:medium
*
*/
public class MyAtoi {
public static void main(String[] args) {
MyAtoi atoi = new MyAtoi();
int i = atoi.myAtoi(" -4193 with words");
System.out.println(i);
}
/**
* 一步步拆,比较清晰
* 注意的点:每一步都维护index++
*
* @param str
* @return
*/
public int myAtoi(String str) {
if (str.length() == 0) return 0;
int index = 0, sign = 1;
// 1、去除空格(第一个条件是为了避免去除空格后索引越界)
while (index <= str.length() - 1 && str.charAt(index) == ' ') {
index++;
}
// 2、同理,防止越界
if (index > str.length() - 1) {
return 0;
}
// 3、处理符号
if (str.charAt(index) == '-' || str.charAt(index) == '+') {
sign = str.charAt(index++) == '-' ? -1 : 1;
}
// 4、处理数字字符串
int res = 0;
while (index <= str.length() - 1) {
// 4.1:获取、判断ascii码是否在0-9范围内
int v = str.charAt(index++) - '0';
if (v < 0 || v > 9) break;
// 4.2:处理越界或即将越界
// 1、下一次*10之前,如果比最值/10大或小,则越界,直接返回最值 2、不大/小,但相等,则比较最值个位值,大于或等于最值个位值,则(即将)越界,返回最值。
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && v >= Integer.MAX_VALUE % 10)) {
return Integer.MAX_VALUE;
}
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && v >= -(Integer.MIN_VALUE % 10))) {
return Integer.MIN_VALUE;
}
// 4.3 处理进位,加上当前个位值(每次都处理符号,方便4.2的判断)
res = res * 10 + sign * v;
}
return res;
}
}
网友评论