LeetCode逆波兰表达式求值题指定测试用例输出错误排查
错误原因排查
- 第一个错误:数字字符串转整数的逻辑错误
你当前的转换代码是ans += (ans * 10)+(numx[j]-48);,这里误用了+=运算符,应该用=直接赋值。举个例子,转换字符串"10"的时候:- 第一位字符'1':
ans*10 + (1-48)结果是1,你用+=后ans等于0+1=1,暂时没问题 - 第二位字符'0':
ans*10 + 0结果是10,你用+=后ans等于1+10=11,和正确值10差了1,这就是你最后结果多1输出23的直接原因
另外你完全没有处理负数的情况,测试用例中的-11会被你错误转换,因为你直接把负号'-'也当成数字位计算('-'的ASCII码是45,45-48=-3,会导致转换结果完全错误)
- 第一位字符'1':
- 第二个错误:除法运算逻辑冗余(可选优化)
C++11及以后标准中,两个int类型的除法默认就是向零取整,和trunc的效果完全一致,你这里先做num1/num2得到int结果,再调用trunc是多余操作,不过这部分不是你本次报错的原因。
修正后核心代码
else { int j = 0; int ans = 0; int sign = 1; string numx = A[i]; // 处理负号 if(numx[0] == '-'){ sign = -1; j = 1; } while(j<numx.length()) { // 把+=修改为= ans = ans * 10 + (numx[j]-'0'); j++; } s.push(ans * sign); }
除法部分可以简化为s.push(num1/num2);。
内容的提问来源于stack exchange,提问作者At-U
相关产品推荐
相关产品推荐

