问题:
实现
atoi
,将字符串转为整数。在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
思路:
采用正则表达式匹配出符号及数字,再利用系统库函数转换,leetcode 系统的测试用例似乎认定数字都是十进制表示的,所以得在代码中去掉最前面的 0。
package xyz.quxiao.play.lab.leetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 作者 :quxiao 创建时间:2018/8/30 23:32
*/public class Problem8 {
private Pattern pattern = Pattern.compile("^\\s*([-+]?[0-9]+)");
public int myAtoi(String str) {
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
String found = matcher.group(1);
String prefix = "";
if (found.startsWith("-")) {
prefix = "-";
}
// 去掉词首的0
found = found.replaceFirst("^[+-]?0*", "");
if ("".equals(found)) {
return 0;
}
found = (prefix + found);
if (isOverflow(found)) {
return found.startsWith("-") ? Integer.MIN_VALUE : Integer.MAX_VALUE;
} else {
return Integer.parseInt(found);
}
} else {
return 0;
}
}
private boolean isOverflow(String str) {
String posMax = String.valueOf(Integer.MAX_VALUE);
String negMax = String.valueOf(Integer.MIN_VALUE);
if (str.startsWith("+")) {
str = str.substring(1);
}
boolean positive = true;
if (str.startsWith("-")) {
positive = false;
}
String target = positive ? posMax : negMax;
if (str.length() < target.length()) {
return false;
} else if (str.length() == target.length()) {
return str.compareTo(target) > 0;
} else {
return true;
}
}
public static void main(String[] args) {
Problem8 problem8 = new Problem8();
System.out.println(problem8.myAtoi(" -42"));
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于