如何检查数组中的数字是不是相等?
Posted
技术标签:
【中文标题】如何检查数组中的数字是不是相等?【英文标题】:How to check if numbers in array equal?如何检查数组中的数字是否相等? 【发布时间】:2013-12-21 17:18:48 【问题描述】:如何检查数组中的数字是否相等? 我有一个包含 10 个数字的数组,我想检查两个或多个数字是否相等。 检查这个的最好方法是什么? 谢谢。
【问题讨论】:
数字在什么范围内?它们是浮点数还是整数? 我认为最直接的方法是对数组进行排序,然后比较相邻元素。 排序然后相邻比较是广义的解决方案,并且消耗 O(n log n)。在可能值的范围有限的特定情况下,将每个值用作辅助数组的索引,并在每次出现该值时将该元素加一。一旦一个元素被多次增加,你就有了一个骗局。这是一个不太通用的解决方案,但是 O(n)。 最佳的通用算法是使用提供散列的 C 库,并注意散列冲突。这也是 O(n),并且不会对输入施加限制。 C++: Fastest method to check if all array elements are equal的可能重复 【参考方案1】:您可以使用以下线性搜索程序解决这个问题。下面的程序不仅会报告相等的数组元素,还会报告相等的数组元素的数量。如果有任何错误请告诉我:)
#include <stdio.h>
int main()
int a[10], i, j, flag = 0;
printf("Please Enter 10 Numbers");
for(i = 0; i < 10; i++)
scanf("%d", &a[i]);
for(i = 0; i < 10; i++)
for(j = i + 1; j < 10; j++)
if(a[i] == a[j])
flag++;
printf("Array Element %d and %d are equal", i, j);
printf("\nThe Equal Numbers In The Array Are = %d", flag);
return 0;
【讨论】:
当 i==j 时的误报。 看起来更好,但循环次数不必要 - 请参阅@simonic 答案。 @MartinJames - 我只看到我的答案和黑客之一。 :| @PranavJituriflag
从未初始化。您的内部循环是正确的,但可以更有效地从 i+1
开始
@PranavJituri i!=j
的目的是什么如果j
是从i+1
开始的【参考方案2】:
对于未排序的数组,最好先对数组进行排序。我使用qsort
函数对数组进行排序。对数组进行排序后,我比较每个元素的相邻元素。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int cmpfunc (const void * a, const void * b)
return ( *(int*)a - *(int*)b );
int main()
int values[] = 88, 56, 100, 2, 100, 56, 56, 56, 2, 1 ;
int count = 0;
qsort(values, 5, sizeof(int), cmpfunc);
for( int i = 0 ; i < SIZE-1; i++ )
if(values[i] == values[i+1])
count++;
printf("%d dupes", count);
return(0);
【讨论】:
不会是 O(n^2) 吗? (因为您需要遍历逐渐缩短的列表最多 n-2 次,以确保发现任何重复。(不是 downvoter 顺便说一句) @simonc; AFAIK;线性搜索算法的阶数为 n。 @hacks 那么请提供一个示例,说明如何在不提前知道值范围的情况下使用单遍线性搜索检测未排序列表中的欺骗。 @hacks 我的意思是说必要的搜索将是 O(n^2) 所以不是线性的。 为什么要进行二分搜索?列表排序后,您只需要查看任何两个相邻元素是否相等。而这只能线性完成。【参考方案3】:如果您使用一维数组,则必须遍历每个元素,然后检查每个相等的索引更大,以防止重复结果,因为(arr[i]==arr[j] => arr[j]==arr[i])
。
#include <stdio.h>
int main()
int i, j, dup=0;
int arr[10] = 4, 7, 2, 4, 3, 1, 7, 9, 6, 5;
for(i = 0; i < 10; i++)
for(j = i + 1; j < 10; j++)
if(arr[i] == arr[j])
printf("arr[%d] = %d = arr[%d] = %d\n", i, arr[i], j, arr[j]);
dup++;
printf("\nnumber of duplicates is %d\n", dup);
return 0;
【讨论】:
@hacks 对不起,我不是在谈论你。我说选择的答案检查它的修订。 别担心 :)以上是关于如何检查数组中的数字是不是相等?的主要内容,如果未能解决你的问题,请参考以下文章