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

C语言数组处理:将重复数字后续出现值替换为0、-1、-2…

问题分析与修正方案

原代码存在几个关键问题,导致结果不符合预期:

  • 数组越界访问:数组下标范围是0到size-1,但代码中循环条件用了<=size,会访问数组之外的内存,引发未定义行为。
  • 多余的外层循环:最外层的k循环完全没必要,重复遍历会导致已修改的元素被错误处理。
  • count逻辑混乱:每次进入i循环就重置count,且内层j循环会重复处理同一元素,同时未考虑已修改后的值会干扰后续匹配。
  • 语法错误:a[j]=count末尾缺少分号,无法通过编译。

修正后的代码

以下是实现需求的正确代码:

#include <stdio.h>

int main()
{
    int a[] = {1,2,1,2,1,2,1,2,1};
    int size = sizeof(a)/sizeof(a[0]);
    
    // 遍历每个元素,检查其之前的重复次数
    for(int i = 0; i < size; i++){
        int repeat_count = 0;
        // 统计当前元素在之前出现的次数
        for(int j = 0; j < i; j++){
            if(a[j] == a[i]){
                repeat_count++;
            }
        }
        // 非首次出现则按规则替换
        if(repeat_count > 0){
            a[i] = -(repeat_count - 1);
        }
    }
    
    // 输出处理后的数组
    for(int i = 0; i < size; i++){
        printf("%d ", a[i]);
    }
    return 0;
}

代码说明

  1. 统计重复次数:对每个元素a[i],遍历它之前的所有元素,统计相同值的出现次数repeat_count。
  2. 替换规则:当repeat_count > 0(即不是第一次出现),按规则替换:
    • 第2次出现(repeat_count=1)→ 替换为0
    • 第3次出现(repeat_count=2)→ 替换为-1
    • 第4次出现(repeat_count=3)→ 替换为-2
      完全匹配需求中的示例逻辑。
  3. 避免越界:所有循环边界都使用< size,确保只访问数组内的有效元素。

测试数组{1,2,1,2,1,2}时,输出结果为1 2 0 0 -1 -1,符合预期;测试{1,1,1}时,输出1 0 -1,也满足要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:20:26