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
相关产品推荐
相关产品推荐

