Java实现windowPosSum数组窗口正元素求和函数问询
windowPosSum函数实现修正
你现有代码存在几个逻辑错误,无法满足需求:
- 函数定义为无返回值
void类型,原代码写了return(sum)属于语法错误,Java数组是引用传递,直接修改传入数组的元素即可,不需要返回计算结果 - 没有做正数判断逻辑,按照要求负数元素不需要做任何替换
- 没有处理数组索引越界问题,当遍历到数组末尾时,
i+n可能超出数组最大索引,会直接抛出运行时异常 - 求和逻辑错误:每个位置的窗口和是独立计算的,不能用全局变量跨位置累加,否则会混入其他窗口的数值
正确实现逻辑
按照需求拆分实现步骤即可:
- 外层循环遍历数组的每一个索引位
- 遇到当前位置值小于等于0的情况,直接跳过进入下一轮循环
- 对正数元素,从当前索引开始向后累加最多n+1个元素(窗口范围是当前元素到当前元素后第n个,共n+1个值)
- 内层累加时如果索引超出数组长度,立刻终止累加
- 把累加得到的和赋值回当前索引位,完成替换
完整可运行代码如下:
public class BreakContinue { public static void windowPosSum(int[] a, int n) { for (int i = 0; i < a.length; i++) { // 负数直接跳过不处理 if (a[i] <= 0) { continue; } int windowSum = 0; for (int offset = 0; offset <= n; offset++) { int currentIdx = i + offset; // 到数组末尾就停止求和 if (currentIdx >= a.length) { break; } windowSum += a[currentIdx]; } a[i] = windowSum; } } // 示例测试 public static void main(String[] args) { int[] testArr = {1, 2, -3, 4, 5, 4}; windowPosSum(testArr, 3); // 输出 [4, 8, -3, 13, 9, 4],和预期结果一致 System.out.println(java.util.Arrays.toString(testArr)); } }
结果验证
用题目给出的示例参数运行时,计算过程完全匹配规则:
- i=0:累加索引0、1、2、3的值,1+2+(-3)+4=4
- i=1:累加索引1、2、3、4的值,2+(-3)+4+5=8
- i=2:值为-3,跳过保留原值
- i=3:累加索引3、4、5的值,4+5+4=13(索引6超出数组长度,终止累加)
- i=4:累加索引4、5的值,5+4=9
- i=5:仅累加索引5的值,结果为4,和原值一致
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

