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

如何用前后各两个元素的和更新数组元素?优化冗余代码方案

简洁高效的数组元素更新方案

你的原代码存在两个核心问题:一是数组越界风险(比如当数组长度n=3时,i=1的分支会访问arr[3],这超出了数组范围);二是分支冗余扩展性差,数组长度变化时需要修改大量if条件,维护成本高。

我们可以换一种思路——对每个元素,直接遍历它需要考虑的前后候选索引(前两个:i-2、i-1;后两个:i+1、i+2),只累加那些在数组合法范围内的元素值。这种方法不需要写一堆分支判断,适配任意长度的数组。

注意:必须先复制原数组到临时数组,避免修改原数组时影响后续元素的计算(比如先改了前面的元素,后面计算时用的是修改后的值,会出错)。

以下是C语言的实现代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int arr[] = {1, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    // 创建临时数组保存原始数据
    int *temp = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        temp[i] = arr[i];
    }

    // 遍历每个元素计算新值
    for (int i = 0; i < n; i++) {
        int sum = 0;
        // 检查前两个元素:i-2、i-1
        if (i - 2 >= 0) sum += temp[i - 2];
        if (i - 1 >= 0) sum += temp[i - 1];
        // 检查后两个元素:i+1、i+2
        if (i + 1 < n) sum += temp[i + 1];
        if (i + 2 < n) sum += temp[i + 2];
        arr[i] = sum;
    }

    // 输出结果
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    free(temp);
    return 0;
}

代码逻辑说明

  • 临时数组temp保存原始数组的所有值,确保计算时用的是初始数据,避免修改干扰。
  • 对每个索引i,依次检查四个候选索引:
    • 前两个索引i-2、i-1:只要大于等于0(即数组中存在该元素)就累加对应值
    • 后两个索引i+1、i+2:只要小于数组长度n(即数组中存在该元素)就累加对应值
  • 最后把计算好的sum赋值给原数组的对应位置。

用你给出的{1,2,3}测试,结果正好是{5,4,3},完全符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:55:31