如果我将阵列设置为:
test[10] = {1,2,1,3,4,5,6,7,8,3,2}
我想返回数字3,因为有重复1,重复2和重复3.我怎样才能实现这一点?效率并不重要。
答案 0 :(得分:2)
您可以使用此代码
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);
}
答案 1 :(得分:1)
首先,您必须对数组进行排序,以便更容易找到重复数据。
以下是排序(冒泡排序)的示例:
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]
,因此它不会超出范围。
答案 2 :(得分: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
}
答案 3 :(得分:1)
如果内存空间无关紧要(我的意思是不受内存使用限制),但运行时间很重要和< strong>你知道数组中的值不大于数组的大小,那么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的有用评论。