Online Compiler C

#include <stdio.h> enum { SIZE = 1000 }; int compression(int a[], int b[], int N){ if(N==0){ return 0; } int count=1,save=0; if(a[0]==1){ b[save++]=0; } for(int i=1;i<N;i++){ if(a[i]==a[i-1]){ count++; }else{ b[save]=count; save++; count=1; } }b[save]=count; return save; } int main(void) { int a[SIZE] = {0}, b[SIZE] = {0}; for (size_t i = 0; i < SIZE; i++) { scanf("%d", &a[i]); } int sizeb = compression(a, b, SIZE); printf("["); for (size_t i = 0; i < (size_t)sizeb; i++) { if (i > 0) printf(","); printf("%d", b[i]); } printf("]"); return 0; }
这段代码实现了一个简单的“游程编码”(Run-Length Encoding)压缩算法。它读取1000个整数,然后统计连续相同数字的个数,将结果存入数组b中。例如输入1 1 0 0 0 2,输出应该是[2,3,1](两个1,三个0,一个2)。

代码中存在一个逻辑错误,导致输出结果不正确。

- 注意处理数组a开头为0的情况。当前代码只在a[0]==1时向b中写入0,但实际应该考虑所有可能的起始值。游程编码需要记录每个连续段的长度,但起始段的数值信息也需要被记录或隐含处理。这里似乎想用b[0]=0来标记第一个段是0,但只对a[0]==1的情况做了处理,逻辑不完整。

- 函数compression返回的save是最后一个写入的索引,但循环结束后又写入了b[save]=count,导致save的值比实际有效元素个数少1。检查返回值和输出循环的边界条件。