题目
原题链接:LeetCode 8. 字符串转换整数 (atoi)
思路
题目首先要判断空格。将前面的空格先一个个扣除。扣完空格记得判断是否到达字符串末尾。
然后判断符号。用一个int存符号,正数为1,负数为-1。
接下来题目又说前置零又说非数字字符又说数字,理一下思路,其实就是判断是否是数字,是数字就进行转换。
转换数字仍然用 r = r * 10 + x
,x从数字首位开始,就算有前置0也没关系。
因为题目可能要求不超过int范围,这里自己写不用long long存。用int,当然就要判断int范围了。
y总题解,中没有带着正负号去判断,他假设res一直为正,最后加上符号,那么以res为正的前提下去判断有没有超出负数范围就需要特判了,因为[-2147483648,2147483647],正负两个最大值最小值的绝对值是不一样的,最好是带着符合去判断,这样不需特判。
需要注意要将res * 10 + x > Integer.MAX_VALUE
的判断转化成res > (Integer.MAX_VALUE - x) / 10
,否则计算过程会超出int范围。
需要注意 x = s.charAt(index) - '0'
需要先提前算出来,否则(Integer.MAX_VALUE - x)
、(Integer.MIN_VALUE - x)
可能超出int范围。比如int最大是10,如果6 + 4
计算过程中不会超,而6 + 6 - 2 + 4
过程中就会超出范围。
代码
class Solution {
public int myAtoi(String s)
{
// 先处理空格
int index = 0;
while(index < s.length() && s.charAt(index) == ' ') index ++;
if (index == s.length()) return 0;
// 判断正负号
int fuhao = 1;
if (s.charAt(index) == '+') index ++;
else if (s.charAt(index) == '-')
{
fuhao = -1;
index ++;
}
// 开始循环持续判断是否为数字
int res = 0;
while (index < s.length() && s.charAt(index) >= '0' && s.charAt(index) <= '9')
{
// 如果为数字,就分正负开始累加
// 先将x拿出来防止超int范围
int x = s.charAt(index) - '0';
if (fuhao == 1) {
if (res > (Integer.MAX_VALUE - x) / 10) return Integer.MAX_VALUE;
res = res * 10 + x;
} else {
x = fuhao * x;
if (res < (Integer.MIN_VALUE - x) / 10) return Integer.MIN_VALUE;
res = res * 10 + x;
}
index ++;
}
return res;
}
}
标签:index,10,int,res,VALUE,atoi,字符串,Integer,LeetCode
From: https://www.cnblogs.com/rdisheng/p/18687275