数组子数组求和代码异常:前置自增导致结果不符的原因解析
两段数组子数组和计算代码的差异原因解析
问题说明
有两段看起来逻辑一致的数组子数组和计算代码,运行结果却截然不同:用测试数组(1,2,3,4)验证时,预期输出为6,9,12,第一段代码输出6,8,10(错误),第二段代码输出6,9,12(正确)。
代码对比
错误代码片段
while(i<vec.size()-1){ sum += -vec[i-2] + vec[++i] ; nums.emplace_back(sum); } return nums;
正确代码片段
while(i<vec.size()-1){ sum += -vec[i-2] + vec[i+1] ; nums.emplace_back(sum); i++; } return nums;
核心差异原因
问题出在前置自增++i的执行时机:
- 错误代码中,
sum += -vec[i-2] + vec[++i]这个表达式里,++i会先修改i的值,再执行表达式内的其他运算。这导致vec[i-2]使用的是自增后的i值,而非循环开始时的原始i值,直接破坏了滑动窗口的计算逻辑(本该减去当前窗口最左端元素,再加上下一个右端元素得到新窗口的和)。 - 正确代码中,
vec[i+1]基于循环初始的i值计算,整个表达式的所有数组访问都使用当前循环的i值,计算完成后才在循环末尾执行i++,完全符合滑动窗口的预期逻辑。
测试用例分步验证(假设初始状态:sum=6,i=2,nums已存入第一个结果6)
错误代码第一次循环
- 先执行
++i,i从2变为3 - 计算
-vec[i-2]→ 此时i为3,取vec[1]即2,结果为-2 - 取
vec[3]即4 - sum更新为
6 + (-2+4)=8,存入nums后数组变为[6,8] - 第二次循环i=3,不满足
i<3(数组长度为4,vec.size()-1=3),循环提前结束,最终结果既少值又错误。
正确代码第一次循环
- 计算
-vec[i-2]→ i为2,取vec[0]即1,结果为-1 - 取
vec[i+1]即vec[3]=4 - sum更新为
6 + (-1+4)=9,存入nums后数组变为[6,9] - 执行
i++,i从2变为3 - 后续循环继续基于正确的i值逻辑执行,最终得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Pradyuman Sharma
相关产品推荐
相关产品推荐

