Online Compiler C

#include <stdio.h> enum { SIZE = 100 }; int compression(int a[], int b[], int N) { if (N <= 0) { return 0; } int count = 1; int num = 0; if(a[0]==1){ return num; } for (int i = 0; i < N; i++) { if (a[i] == a[i - 1]) { count++; } else { b[num] = count; num++; count = 1; } } b[num] = count; num++; return num; } 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; }
这段代码试图实现一个简单的“游程编码”压缩:将连续重复的数字替换为(重复次数, 数字)的形式。但代码中只存储了次数,没有存储数字本身,而且存在逻辑错误。

- 在循环中,当 `i=0` 时,`a[i-1]` 会访问数组越界,导致未定义行为。
- 条件 `if(a[0]==1){ return num; }` 看起来是多余的,并且会导致输入第一个元素为1时直接返回0,这不符合压缩逻辑。
- 压缩结果应该同时包含数字和它的重复次数,但当前只存储了次数,丢失了数字信息。

- 检查循环的起始索引和边界条件,确保不会访问数组的负索引。
- 思考压缩结果应该包含哪些信息:除了重复次数,还需要记录对应的数字值。