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

如何实现数组随机位置被替换为指定值的原数值对应计数器累加

实现方案

注意:你的示例中数组和计数器都使用了a作为变量名,实际开发请避免重名冲突,下文统一将原数组命名为original_arr,标记值设为宏定义TARGET_VAL = 20。

直接修改原数组覆盖原值会导致无法追溯替换前的数值,因此需要额外存储原值的映射关系,有两种常用实现方案:

方案1:维护替换原值映射表

新增一个和原数组等长的数组存储被替换位置的原始值,未被替换的位置可以设为和TARGET_VAL相同的值做标识。

初始化代码

#define ARR_LEN 10 // 按实际数组长度调整
#define TARGET_VAL 20
int original_arr[ARR_LEN] = {1,2,3,4,5,6,7,8,9,10};
// 存储被替换位置的原值,初始值等于TARGET_VAL表示对应位置未被替换
int replaced_val[ARR_LEN];
for(int i=0; i<ARR_LEN; i++) {
    replaced_val[i] = TARGET_VAL;
}
// 对应原数值1、3、4的计数器,可按需扩展
int cnt1 = 0, cnt3 = 0, cnt4 = 0;

替换操作逻辑

每次执行将某索引替换为TARGET_VAL的操作时,同步存储原值:

// i为待替换的索引
if(original_arr[i] != TARGET_VAL) { // 避免重复替换覆盖原值
    replaced_val[i] = original_arr[i];
    original_arr[i] = TARGET_VAL;
}

选中目标位置后的计数器更新逻辑

// idx为选中的、值为TARGET_VAL的索引
int old_val = replaced_val[idx];
if(old_val == 1) cnt1++;
else if(old_val == 3) cnt3++;
else if(old_val == 4) cnt4++;
// 其他原值的计数规则可按同理扩展

方案2:不修改原数组,单独维护替换标记

该方案不对原数组做任何修改,新增布尔数组标记哪些索引属于「被替换为TARGET_VAL」的状态,读取数组时动态判断返回值即可,原值一直保留在原数组中,无需额外存储。

初始化代码

#define ARR_LEN 10
#define TARGET_VAL 20
int original_arr[ARR_LEN] = {1,2,3,4,5,6,7,8,9,10};
bool is_replaced[ARR_LEN] = {false}; // 标记索引是否被替换为TARGET_VAL
int cnt1 = 0, cnt3 = 0, cnt4 = 0;

替换操作逻辑

// i为待替换的索引
is_replaced[i] = true;

数组值读取逻辑

需要获取数组某索引的当前值时调用该方法:

int get_arr_val(int idx) {
    return is_replaced[idx] ? TARGET_VAL : original_arr[idx];
}

选中目标位置后的计数器更新逻辑

直接读取原数组的原值即可:

// idx为选中的、被标记为替换的索引
int old_val = original_arr[idx];
if(old_val == 1) cnt1++;
else if(old_val == 3) cnt3++;
else if(old_val == 4) cnt4++;

扩展性优化

如果需要统计的原值数量较多,可直接用计数器数组简化逻辑,避免堆叠大量判断语句:

// 假设原数组取值范围为1~10
int cnt[11] = {0};
// 选中后直接计数,无需判断
cnt[old_val]++;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 09:15:04