Online Compiler C

// by youyou2007 in 2026. #include <stdio.h> #include <stdlib.h> int a[105], b[105], N; int compression(int a[], int b[], int N) { if(N == 0) { b[0] = 0; return 0; } int cnt = 1, lenb = -1; if(a[0] == 1) b[++lenb] = 0; int now = a[0]; for(int i = 1; i <= N - 1; i++) { if(a[i] == now) { cnt++; } else { b[++lenb] = cnt; cnt = 1; now = a[i]; } } b[++lenb] = cnt; /* printf("["); for(int i = 0; i < lenb; i++) { printf("%d,", b[i]); } printf("%d]", b[lenb]);*/ return lenb; } int main() { scanf("%d", &N); for(int i = 0; i <= N - 1; i++) scanf("%d", &a[i]); int len=compression(a, b, N); for(int i = 0; i <= len; i++) { printf("%d ", b[i]); } return 0; }
这段代码实现了一个简单的“游程编码”(Run-Length Encoding)压缩算法。它读取一个整数数组 `a`,然后统计连续相同数字的个数,并将这些计数存入数组 `b` 中。例如,输入 `1 1 2 2 2 3` 会输出 `2 3 1`(表示两个1、三个2、一个3)。

代码中存在一个逻辑错误。当数组的第一个元素是1时,代码会额外在 `b` 中插入一个0,这不符合游程编码的常规逻辑。这个特殊处理会导致输出结果错误。

- 检查 `if(a[0] == 1) b[++lenb] = 0;` 这一行。思考一下:为什么只对第一个元素为1的情况做特殊处理?这个处理是否合理?它会导致什么结果?
- 注意 `lenb` 的初始值是 -1,而函数返回的是 `lenb`。在 `main` 中,循环条件是 `i <= len`。请确认这个循环范围是否正确,特别是当数组为空或只有一个元素时。