继续打卡算法题,今天学习的是第LeetCode8题字符串转换整数 (atoi),这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码能力有一些帮助。
分析一波题目
这道题目里面给了很多详细的信息,首先需要对字符串进行格式解析与校验,包含正负符号,空格需要去除,最终得到都是数字的字符串了。
比如'-123', 得到'123',如果是一个纯数字的字符串,我们可以从高位开始,每次取上一位得到的数字乘10,再加上当前的数字,直到达到最低位。
以123
为例,比如t代表每次解析到的数字,res代表上一个位置计算的数字。
遍历第一个数字
t = 1
res = 0 * 10 + t = 1
遍历第二个数字
t = 2 res = 1 * 10 + t = 12
遍历第三个数字
t = 3 res = 12 * 10 + t = 123
这样遍历一次之后,字符串就可以解析为一个数字了。
编码解决
class Solution {
public int myAtoi(String s) {
//1、空串判断
if(s.isEmpty())
return 0;
int res = 0;
int index = 0;
int n = s.length();
//2、去掉前导空格(如果有)
while(index < n){
if(s.charAt(index) == ' ')
index++;
else
break;
}
//3、去掉空格就什么都没有了
if(index == n)
return 0;
int sign = 1;
//4、处理第一个符号是正负号的情况
if(s.charAt(index) == '+')
index++;
else if(s.charAt(index) == '-'){
index++;
sign = -1;
}
//5、去掉符号就什么都没有了
if(index == n)
return 0;
while(index < n){
char c = s.charAt(index);
//6、后续非法字符,截断
if(c < '0' || c > '9')
break;
//7、处理越界情况,超过了整型最大值
if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (c - '0') > Integer.MAX_VALUE % 10))
return Integer.MAX_VALUE;
//7、处理越界情况,低于整型最小值
if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (c - '0') > -(Integer.MIN_VALUE % 10)))
return Integer.MIN_VALUE;
res = res * 10 + sign * (c - '0');
index++;
}
return res;
}
}
总结
第6/7/8题都没有很多算法,都是需要对一个数字的表示要有理解,不管是从高位到低位,还是从低位到高位,都要知道怎么表达一个数字。