问题:
实现
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")); } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于