题目描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
题解一
这道题简直细节满满,在边界条件那里试错了无数次,整型总是溢出,最后用了借助了Math.addExact和try catch用来判断整型溢出。Math.addExact和普通加法的区别在于如果和溢出的时候会抛一个 ArithmeticException 异常。看来以后2147483637和-2147483648是会记住了......具体的话有以下几个步骤吧:
- 跳过前面的空格(如果有的话)
- 判断第一个字符是不是正号,如果是的话,其后一定要接数字
- 判断第一个字符是不是负号,如果是的话,保存标志
- 开始遍历数字,使用 -'0'或Character.digit()得到数字,使用Math.addExact和try catch判断整型溢出
- 如果不是数字,就结束这个过程,返回答案
下面是参考代码:
class Solution {
public int strToInt(String str) {
if (str.equals(""))
return 0;
int index = 0, res = 0;
boolean negative = false;
while (index < str.length() && (str.charAt(index) == ' ')) index++;
// +后面一定要接数字
if (index < str.length() && str.charAt(index) == '+') {
index++;
if (index < str.length() && (str.charAt(index) < '0' || str.charAt(index) > '9'))
return 0;
}
// 如果是-,保存标志
if (index < str.length() && str.charAt(index) == '-') {
if (index > 0 && str.charAt(index-1) == '+') return 0;
negative = true;
index++;
}
while (index < str.length() && str.charAt(index) >= '0' && str.charAt(index) <= '9') {
try {
res = Math.addExact(Math.multiplyExact(res, 10), str.charAt(index++)-'0');
} catch (ArithmeticException e) {
return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
}
return negative ? -res : res;
}
}
题解二
第二种方法是使用正则表达式,不得不说,正则表达式太强大了。
class Solution {
public int strToInt(String str) {
str = str.trim();
Pattern pattern = Pattern.compile("^[\\+\\-]?\\d+");
Matcher matcher = pattern.matcher(str);
int value = 0;
if (matcher.find()) {
try {
value = Integer.parseInt(str.substring(matcher.start(), matcher.end()));
} catch (NumberFormatException e) {
value = str.charAt(0) == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
}
return value;
}
}
网友评论