在线编译器 C

#include <stdio.h> int main() { int arr[10]; // 1. 读取 10 个通过空格分隔的整数 for (int i = 0; i < 10; i++) { scanf("%d", &arr[i]); } int first = 1; // 用于控制输出空格的标志变量 // 2. 遍历数组,统计每个数字出现的次数 for (int i = 0; i < 10; i++) { int count = 0; for (int j = 0; j < 10; j++) { if (arr[j] == arr[i]) { count++; } } // 3. 如果出现次数正好等于 1,则输出 if (count == 1) { if (!first) { printf(" "); } printf("%d", arr[i]); first = 0; // 打印过第一个数字后,后续数字前都需要加空格 } } printf("\n"); return 0; }
这段代码的功能是:读取10个整数,然后输出其中只出现一次的数字(即唯一数),数字之间用空格分隔。

代码的逻辑是:对数组中的每个元素,统计它在整个数组中出现的次数,如果次数等于1,就输出这个数字。

这段代码有一个问题:当数组中有重复数字时,每个重复的数字都会被多次检查,导致输出结果中同一个唯一数可能会被重复输出多次。例如,如果数组是 [1, 2, 2, 3],那么数字1和3会被输出,但数字1会被检查一次,数字3会被检查一次,这看起来没问题。但如果数组是 [1, 1, 2],那么数字2只出现一次,但外层循环会遍历到两个1和一个2,对于每个1,内层循环统计出count=2,所以不输出;对于2,count=1,输出一次。所以这个例子中输出是正确的。但考虑数组 [1, 2, 3, 1, 2, 3, 4, 5, 6, 7],唯一数有4,5,6,7,每个唯一数只被检查一次,所以输出正确。实际上,只有当唯一数本身在数组中只出现一次时,它只被外层循环访问一次,所以不会重复输出。但如果有多个相同的唯一数?不可能,因为唯一数定义就是只出现一次。所以这段代码在功能上似乎是正确的,但效率较低,因为对每个元素都重新统计整个数组。

- 提示1:思考一下,如果数组中有多个相同的数字(比如两个2),那么外层循环遇到第一个2时,内层统计出count=2,不输出;遇到第二个2时,同样count=2,不输出。所以不会重复输出。但如果有三个相同的数字,同样不会输出。所以这段代码实际上不会重复输出唯一数,因为唯一数只出现一次,外层循环只遇到它一次。因此代码逻辑没有错误,但效率不高。

- 提示2:你可以考虑优化算法,比如先对数组排序,然后只比较相邻元素,这样能更高效地找出唯一数。或者使用一个额外的数组来记录每个数字出现的次数,避免重复统计。