如果我有一个数组设置为:
test[10] = {1,2,1,3,4,5,6,7,8,3,2}
我想返回数字 3,因为有重复的 1、重复的 2 和重复的 3。我怎样才能做到这一点?效率无所谓。
如果我有一个数组设置为:
test[10] = {1,2,1,3,4,5,6,7,8,3,2}
我想返回数字 3,因为有重复的 1、重复的 2 和重复的 3。我怎样才能做到这一点?效率无所谓。
您可以使用此代码,
int main()
{
int test[10] = {1,2,1,3,4,5,6,7,8,3,2};
int i,j,dupliCount = 0;
for (i =0; i<(sizeof(test)/sizeof(int));i++)
{
for(j=i+1;j<(sizeof(test)/sizeof(int));j++)
{
if (test[i] == test[j])
{
++dupliCount;
break;
}
}
}
printf("duplicate count %d",dupliCount);
}
首先,您必须对数组进行排序,以便更容易找到重复项。
这是排序(冒泡排序)的示例:
void bubbleSort(int numbers[], int array_size) {
int i, j, temp;
for (i = (array_size - 1); i > 0; i--) {
for (j = 1; j <= i; j++) {
if (numbers[j-1] > numbers[j]) {
temp = numbers[j-1];
numbers[j-1] = numbers[j];
numbers[j] = temp;
}
}
}
}
然后再次循环并查找values[i]
是否==
要values[i+1]
注意:当您创建 for 循环时,使其长度缩短 1 以进行补偿,values[i+1]
这样它就不会超出范围。
我花了一些时间来调试这个。int test[11] = {1,2,1,3,4,5,6,7,8,3,2}
因为不应该int test[10]
。每个元素都有 0 到 10 的订阅。所以总共有 11 个元素。
#include <stdlib.h>
#define LEN (11)
int test[LEN] = {1,2,1,3,4,5,6,7,8,3,2};
void sort(int n, int *test){//sort them, use whatever you like
int i,j,y;
for (i=0;i<n;++i){
for (j=i+1;j<n;++j)
if (test[i]>test[j]){
y=test[i];
test[i]=test[j];
test[j]=y;
}
}
}
int main(){
sort(LEN,test);//sort first
int cnt = 0 , i ;
for(i=1;i<LEN;++i)
cnt += (test[i]==test[i-1]);//count duplicates
printf("%d\n",cnt);//print result
}
如果内存空间无关紧要(我的意思是您不受内存使用的限制)但运行时间很重要,并且您知道数组中的值不大于数组的大小,那么Bucket Sort
听起来像是工作。它将在 O(n) 而不是 O(nlgn) 中完成工作(如果您决定先对数组进行排序)。
int main()
{
int test[LEN] = {1,2,1,3,4,5,6,7,8,3,2};
int ndup = 0;
int bucket_array[LEN] = {0};
for (i = 0; i < LEN; i++) {
if (bucket_array[test[i]]++) {
ndup++;
}
}
printf("%d duplicates\n", ndup);
return 0;
}
我还没有编译它,但我想它应该可以完成这项工作。
注意:非常感谢 jim balter 的有用评论。