-1

如果我有一个数组设置为:

test[10] = {1,2,1,3,4,5,6,7,8,3,2}

我想返回数字 3,因为有重复的 1、重复的 2 和重复的 3。我怎样才能做到这一点?效率无所谓。

4

4 回答 4

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);
}
于 2013-04-09T04:39:45.463 回答
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]这样它就不会超出范围。

于 2013-04-09T03:59:11.570 回答
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

    }
于 2013-04-09T04:07:26.917 回答
1

如果内存空间无关紧要(我的意思是您不受内存使用的限制)但运行时间很重要,并且您知道数组中的值不大于数组的大小,那么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 的有用评论。

于 2013-04-09T07:17:11.713 回答