实现 atoi,将字符串转为整数。
该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
public int myAtoi(String str) {
//先去除头尾空字符串
str = str.trim();
//如果含有空格还需要去掉
if (str .contains(" ")) {
String[] strs1 = str.split(" ");
str = strs1[0];
}
//如果有小数点,需要去掉小数点后面的;
if (str.contains(".")) {
String[] strs2 = str.split("\\.");
str = strs2[0];
}
//正则判断是否为纯数字字符串
String regex = "^[-\\+]?[\\d]+$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if (!matcher.matches())
return 0;
if (Long.parseLong(str) > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
if (Long.parseLong(str) < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
//然后转为数字
int res = Integer.parseInt(str);
return res;
}
注意:具体思路操作代码上有注解,此方法不能再leekcode上面执行,因为不能识别Pattern类。
后面测试
输入: " -0012a42" 输出:0 预期:-12
还有这个要求,用Java这些基础类功能会比较繁琐,需要改进;
思路:可以先把第一个不含空格的字符串拿出来,挨个遍历其中每个字符,首个为“+,-”或者数字都可,一直到出现非数字字符,把这些结果依次保存最后输出即可;
public int myAtoi(String str) {
//先去除头尾空字符串
str = str.trim();
//如果含有空格还需要去掉
if (str .contains(" ")) {
str = str.split(" ")[0];
}
//如果有小数点,需要去掉小数点后面的;
if (str.contains(".")) {
str = str.split("\\.")[0];
}
String regex = "^[-\\+]?[\\d]*$";
Pattern pattern = Pattern.compile(regex);
Pattern pattern1 = Pattern.compile("^[\\d]$");
Matcher matcher = pattern.matcher(str);
//截取正确的数字段
StringBuffer buffer = new StringBuffer();
char[] chs = str.toCharArray();
if (pattern.matcher(String.valueOf(chs[0])).matches())
buffer.append(chs[0]);
for (int i = 1; i < chs.length;i ++) {
if (pattern1.matcher(String.valueOf(chs[i])).matches()) {
buffer.append(chs[i]);
} else {
break;
}
}
str = buffer.toString();
if (str.length() == 0 || (str.length() == 1 && (str.contains("-") || str.contains("+"))))
return 0;
if (Long.parseLong(str) > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
if (Long.parseLong(str) < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
//然后转为数字
int res = Integer.parseInt(str);
return res;
}
改进后的代码,可以进行上述那种字符串的检测,但是代码整体有点臃肿,对JDK的API依赖很大,要想通过LeekCode测试,可以把每个字符的判断自己写个方法,就是一个注意筛选,然后求得纯数字字符串,然后转化罢了!求大佬有没有精简的算法?