@LeetCode刷题
题目
一、实现思路
- 首先删除前导空格;
int index = 0;
while (index < len && charArray[index] == ' ') {
index++;
}
- 接着确认符号位;
int sign = 1;
if (s[index] == '+') {
index++;
} else if (s[index] == '-') {
index++;
sign = -1;
}
- 循环接收数值。
二、总体代码
代码如下(示例):
public class Solution {
class Solution {
public int myAtoi(String s) {
int len = s.length();
char[] str = s.toCharArray();
// 1、去除前导空格
int index = 0;
while (index < len && str[index] == ' ') {
index++;
}
// 3、如果出现符号字符,仅第 1 个有效,并记录正负
int sign = 1;
if (index<len && str[index] == '+') {
index++;
} else if (index<len && str[index] == '-') {
index++;
sign = -1;
}
// 4、将后续出现的数字字符进行转换
int res = 0;
while (index < len) {
char t = str[index];
if (t > '9' || t < '0') {
break;
}
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (t - '0') > Integer.MAX_VALUE % 10)) {
return Integer.MAX_VALUE;
}
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (t - '0') > -(Integer.MIN_VALUE % 10))) {
return Integer.MIN_VALUE;
}
// 4.2 合法的情况下,才考虑转换,每一步都把符号位乘进去
res = res * 10 + sign * (t - '0');
index++;
}
return res;
}
}
总结
我认为的难点在于判断是否越界,一开始只判断是否大于最大值或小于最小值,但是大于最大值和小于最小值都会造成数据溢出,数据溢出后再进行比较是无效的,然后将最大值除以10,如果大于,再查看当前字符和最值的最后一个数值相比,是大是小,如果大,越界。