LeetCode第8题atoi解法遇'-+42'连续符号用例失败,如何修改代码?
逻辑问题说明
- 没有限制符号的出现次数和位置:当前代码遍历过程中只要碰到
+/-就会覆盖sign的值,没有判断符号是否已经出现过、是否已经开始读取数字。对于输入-+42,代码会先把sign设为-,再覆盖为+,最后读取到数字42返回42,不符合题目要求(连续符号属于非法输入,应该返回0)。 - 分支逻辑冗余:非数字判断分支里重复包含了
+/-的判断,和前面的符号判断分支冲突,没有起到提前终止非法符号的作用。 - 字符串比较不规范:判断digit为空时使用
==,Java中字符串内容比较应该使用equals方法,存在潜在逻辑风险。
调整方案
- 新增布尔类型的标记位,记录符号是否已经完成设置,符号仅允许在未设置、还未读取到数字的场景下出现一次,再次碰到符号直接终止遍历。
- 调整分支判断顺序,优先判断是否是数字,再判断是否是未被设置过的符号,其余字符直接终止遍历。
- 修正字符串比较的写法。
修改后的代码如下:
class Solution { public int myAtoi(String s) { s = s.trim(); if (s.length() == 0) return 0; char sign = '+'; boolean signSet = false; StringBuilder digit = new StringBuilder(); for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 是数字直接拼接 if (Character.isDigit(c)) { digit.append(c); } // 是符号且还没设置过符号、也未读到数字 else if ((c == '-' || c == '+') && !signSet && digit.length() == 0) { sign = c; signSet = true; } // 其他字符直接终止遍历 else { break; } } if (digit.length() == 0) return 0; try { int n = Integer.parseInt(digit.toString()); return sign == '-' ? -n : n; } catch(NumberFormatException e) { return sign == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE; } } }
内容的提问来源于stack exchange,提问作者smit
相关产品推荐
相关产品推荐

