You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode第8题atoi解法遇'-+42'连续符号用例失败,如何修改代码?

逻辑问题说明
  • 没有限制符号的出现次数和位置:当前代码遍历过程中只要碰到+/-就会覆盖sign的值,没有判断符号是否已经出现过、是否已经开始读取数字。对于输入-+42,代码会先把sign设为-,再覆盖为+,最后读取到数字42返回42,不符合题目要求(连续符号属于非法输入,应该返回0)。
  • 分支逻辑冗余:非数字判断分支里重复包含了+/-的判断,和前面的符号判断分支冲突,没有起到提前终止非法符号的作用。
  • 字符串比较不规范:判断digit为空时使用==,Java中字符串内容比较应该使用equals方法,存在潜在逻辑风险。
调整方案
  1. 新增布尔类型的标记位,记录符号是否已经完成设置,符号仅允许在未设置、还未读取到数字的场景下出现一次,再次碰到符号直接终止遍历。
  2. 调整分支判断顺序,优先判断是否是数字,再判断是否是未被设置过的符号,其余字符直接终止遍历。
  3. 修正字符串比较的写法。

修改后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:30:04