思路简述:
分为两个模块
- 处理出需要的有效数字
- 累减法处理字符转大数,借鉴标准库 Integer.parseInt
class Solution {
public int myAtoi(String s) {
// 转换为字符数组
char[] chs = s.toCharArray();
// 判断符号
// 截取数字部分
// 累减法转换成数字
int len = chs.length;
char[] num = new char[len]; // 初始化数组
int index = 0; // 有效数字位
int sign = 0; // -1负数/0未初始化/1正数
for (char c : chs) {
// 丢弃空格
if (c == ' ') {
if (sign == 0) {
continue;
} else {
// 第二个空格
break;
}
}
// 非数字处理
if (c > '9' || c < '0') {
// 如果是符号
if (c == '-' || c == '+') {
// 已经初始化,不需要符号
if (sign != 0) break;
else {
// 获取符号位
sign = c == '-' ? -1 : 1;
continue;
}
} else {
break;
}
}
// 如果没有符号,则默认为正数
if (sign == 0) sign = 1;
// 数字处理,index标识有效数字个数,每添加一个+1
num[index++] = c;
}
// 如果没有有效数字则返回 0
if (index <= 0) return 0;
return convert(num, index, sign >= 0);
}
// 参照Integer.parseInt 方法
// 累减法迫近极限
public int convert(char[] chs, int index, boolean positive) {
// 数字部分,有效数字位,是否为正数
int result = 0;
int limit = positive ? -Integer.MAX_VALUE : Integer.MIN_VALUE;
for (int i = 0; i < index; i++) {
int digit = chs[i] - '0';
if (limit / 10 > result ||10 * result < limit + digit) {
// 超出边界值
return positive ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
// 十进制,升位 * 10
result *= 10;
// 如果未超边界,继续累减
result -= digit;
}
return positive ? -result : result;
}
}
Q.E.D.