数组中的唯一数字

与我之前的问题类似,这次我试图打印不会出现两次或两次以上的数字。

这是我的代码:

#include  int main() { int i; int a[10]={2,2,2,4,6,6,9,10,10,11}; for(i=0; i  0 && a[i] != a[i-1]) printf("%d ",a[i]); } if(i==9 && a[i]!=a[i-1]) printf("%d", a[i]); } printf("\n"); return 0; } 

输出结果是正确的,即4,9,11,但我需要分别考虑i的最终值。 有没有更好的办法?

请注意,逻辑运算符具有优先级,并且在if语句中具有相同的优先级,它们从左到右进行计算。 所以

 if(a[i] != a[i+1] && i!=9) 

将在i!=9之前评估a[10] ,导致超出读取。 如果你改变它

 if(i!=9 && a[i] != a[i+1]) 

问题不会发生,因为i!=9之前会被评估,并且因为它将是假的,所以其余部分是假的并且没有被评估,没有超出读取。

更好的是,循环i=0; i<9 i=0; i<9并且如果在循环外部移动第二个,则完全不需要检查i!=9

而且,对于数组{2,3,.....} ,代码将失败,它不会按原样打印第一个元素。

这是代码的更好版本

 #include  int main() { int i; int a[10]={2,2,2,4,6,6,9,10,10,11}; for(i=0; i < 9; ++i) { if(a[i] != a[i+1]) { if(i == 0 || a[i] != a[i-1]) printf("%d ",a[i]); } } if(a[8] != a[9]) printf("%d", a[9]); printf("\n"); return 0; } 

请注意,在循环之后,我们只需使用正确的下标。 更有效,因为添加ifs来检查最后一个元素将在每次迭代时评估这些ifs ,而现在它只被评估一次。

希望有所帮助

您始终可以使用嵌套for循环来检查值。 这种方式也适用于未排序的列表。

 int i; int j; int match; for (i = 0; i < 10; i++) { match = 0; for(j = 0; j < 10; j++) { if (a[i] == a[j] && i!=j) match = 1; break; } if (match == 0) printf("%d",a[i]); } 

此代码将根据所有其他值检查每个值,并根据您的示例打印仅在列表中找到的数字。

你只需要检查在for循环中i的值不会超出数组绑定

我认为这应该有效

 int main() { int i; int a[10]={2,2,2,4,6,6,9,10,10,11}; for(i=0; i < 10; ++i) { if(a[i] != a[(i+1)%10]) { if(i > 0 && a[i] != a[i-1]) printf("%d ",a[i]); } } printf("\n"); return 0; } 

接受答复后

在排序数组上查找唯一值的简化方法。

 #include  int main() { int a[] = { 2, 2, 2, 4, 6, 6, 9, 10, 10, 11 }; size_t n = sizeof a / sizeof a[0]; int previous = ~a[0]; size_t i; for (i = 0; i < n; i++) { if (a[i] != previous) printf("%d ", a[i]); previous = a[i]; } printf("\n"); return 0; }