Online Compiler C

#include <stdio.h> int main() { int arr[10]; int result[10]; int result_count = 0; // 1. 读取 10 个通过空格分隔的整数 for (int i = 0; i < 10; i++) { scanf("%d", &arr[i]); } // 2. 遍历原数组,找出重复的数字 for (int i = 0; i < 10; i++) { int count = 0; // 统计当前数字在整个数组中出现的总次数 for (int j = 0; j < 10; j++) { if (arr[j] == arr[i]) { count++; } } // 如果出现次数大于 1,说明是重复数字 if (count > 1) { // 检查这个数字是否已经保存到结果数组中(去重) int already_exists = 0; for (int k = 0; k < result_count; k++) { if (result[k] == arr[i]) { already_exists = 1; break; } } // 如果结果数组里还没有这个数字,就加进去 if (!already_exists) { result[result_count] = arr[i]; result_count++; } } } // 3. 按要求格式化输出结果 for (int i = 0; i < result_count; i++) { printf("%d", result[i]); if (i < result_count - 1) { printf(" "); } } printf("\n"); return 0; }
这段代码的功能是:读取10个整数,找出其中出现次数超过一次的数字(即重复数字),并去重后按原顺序输出,数字之间用空格分隔。

代码逻辑基本正确,但有一个潜在问题需要注意。

- 你使用了两层循环来统计每个数字的出现次数,这种方法的时间复杂度是O(n²),对于10个元素来说可以接受,但效率不高。可以考虑更高效的方法,比如先排序再统计,或者使用哈希表。
- 在输出时,你按照数字在数组中第一次出现的顺序输出,但你的去重逻辑依赖于遍历顺序,实际上输出顺序是原数组中重复数字第一次出现的位置顺序,这符合题目要求吗?请确认题目是否要求按原顺序输出。