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

Java实现自定义myAtoi(atoi)函数测试用例运行失败如何解决?

问题原因分析
  • 非数字起始场景处理不符合规则
    atoi的标准逻辑要求:跳过所有前导空格后,若第一个非空格字符既不是正负号也不是数字,直接返回0。你当前的代码会遍历整个字符串提取所有数字字符,因此输入"words and 987"时会错误提取到987,正确返回值应为0。
  • 溢出判断逻辑完全失效
    Java中int为32位有符号整数,取值范围是-2147483648到2147483647。你使用int类型的num存储计算结果,当数值超出int范围时会触发溢出截断,此时num已经是被截断后的异常值,不可能再超出int的取值范围,后续的范围判断永远不会生效。输入"-91283472332"时数值远小于int最小值,溢出后返回结果不符合预期。
  • 隐含的其他问题:全空格字符串会触发数组越界,数字中间夹杂非数字字符时会错误提取后续数字,比如"123abc456"会被错误转为123456,正确结果应为123。
修复后代码
class Solution {
    public int myAtoi(String s) {
        int length = s.length();
        boolean pos = true;
        int i = 0;
        long num = 0; // 改用long存储临时结果避免提前溢出
        
        if(length == 0) {
            return 0;
        }
        
        // 跳过前导空格
        while(i < length && s.charAt(i) == ' ') {
            i++;
        }
        // 全是空格的场景直接返回
        if(i >= length) {
            return 0;
        }
        
        // 处理正负号
        if(s.charAt(i) == '-') {
            pos = false;
            i++;
        } else if(s.charAt(i) == '+') {
            pos = true;
            i++;
        }
        
        // 处理数字部分,遇到非数字直接终止
        while(i < length && Character.isDigit(s.charAt(i))) {
            int digit = Character.getNumericValue(s.charAt(i));
            num = num * 10 + digit;
            // 提前判断溢出,减少不必要计算
            if(pos && num > Integer.MAX_VALUE) {
                return Integer.MAX_VALUE;
            }
            if(!pos && -num < Integer.MIN_VALUE) {
                return Integer.MIN_VALUE;
            }
            i++;
        }
        
        // 应用符号
        num = pos ? num : -num;
        return (int)num;
    }
}
关键修改说明
  • 新增全空格场景的边界判断,避免数组越界异常
  • 严格遵循atoi规则:跳过前导空格后非合法起始字符直接返回0,数字遍历遇到非数字立即停止
  • 改用long存储临时计算结果,累加过程中提前判断溢出,避免int提前溢出导致的判断失效
  • 提前在累加过程中做溢出判断,无需遍历完超长数字字符串即可返回边界值,性能更优

内容的提问来源于stack exchange,提问作者user14759644

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:27:01