如何用前后各两个元素的和更新数组元素?优化冗余代码方案
简洁高效的数组元素更新方案
你的原代码存在两个核心问题:一是数组越界风险(比如当数组长度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
相关产品推荐
相关产品推荐

