您好我很高兴知道这个网站提问。我有一个问题,我做了一个数组。然后我想检查数组中的匹配值。例如,
int array[5]={1,2,4,2,5} ;
因此,array[1]
,array[3]
重复了值2。那么如何检查重复值?
使用for
/ if
是检查相同值的唯一方法吗?
答案 0 :(得分:1)
差不多。至少,这是做你想做的最简单的方法。如果您需要控制事件或类似情况,可能Map类型更适合您。
答案 1 :(得分:0)
你如何使用“qsort”?
qsort(( void * )array, 5 , sizeof( data[0] ) , my_sort );
my_sort是一个创建自己的函数。 例如,
int my_sort( const void * a , const void * b ) {
if( *( int * )a < *( int * )b ) {
return -1;
}
else
if( *( int * )a == *( int * )b ) {
// You can check here.
return 0;
}
return 1;
}
答案 2 :(得分:0)
这取决于你的数组上是否存在int的大小限制。
如果您可以确定(并检查)数组中的所有元素都被限制在相对较小的范围内(例如,介于0到255之间),则可以使用单独的数组MAXVAL-MINVAL来跟踪数组中的每个元素首先出现在哪里。如果是这种情况,您可以快速签入O(n)(其中n是数组的大小)是否(甚至在哪里)有重复项。
它可能看起来像这样(警告:我没有检查甚至编译此代码)
#define COUNTOF(x) ( sizeof(x) / sizeof((x)[0]) )
int i, flags[MAXVAL-MINVAL];
for(i=0; i<COUNTOF(flags); i++) flags[i]=-1; // Initialize flags to 'not found'
for(i=0; i<COUNTOF(array); i++)
{
if (flags[array[i]-MINVAL]!=-1) // Duplicate value found
printf("Value %d was found in positions %d and %d\n",array[i], i, flags[array[i]-MINVAL]);
else // Value had not been found before
flags[array[i]-MINVAL]=i; // Keep track of where first seen
}
答案 3 :(得分:-1)
使用类似的东西:
int matchCount = 0;
for(int i = 0;i < (sizeof(array)/sizeof(int)); i++)
{
for( int j=0; j<(sizeof(array)/sizeof(int)); j++)
{
if( i != j ) // skip when both indexes point to same location
{
if( array[i] == array[j] )
{
matchCount++;
}
}
}
}
以上是针对整数数组的。 与其他大小类型的数组非常相似的代码
将计算两次匹配,因此将最终matchCount除以2