如何实现数组随机位置被替换为指定值的原数值对应计数器累加
实现方案
注意:你的示例中数组和计数器都使用了
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
相关产品推荐
相关产品推荐

