数组中的不同唯一元素

时间:2018-11-21 11:47:06

标签: c arrays

我尝试编写代码以计算给定数组中不同唯一元素的数量,但是却得到了不希望的输出。{ 2, 7, 5, 8, 9, 5, 7, 5, 5, 3}这是给定的数组元素。不同的唯一值是{ 2, 8, 9, 3},这意味着存在4.但是我的程序返回6:{2,5,8,9,7,3}

这是我的代码:

 #include <stdio.h>
 #include <stdlib.h>


int unique(int *arr, int n)
{
     int u = 1;

     for (int i = 1; i < n; ++i)
     {
        int is_u = 1;
        for (int j = 0; is_u && j < i; ++j)
        {
             if (arr[j] == arr[i]) is_u = 0;
        }
        if (is_u) ++u;
     }
     return u;
}


int main(void) {
    int arr[] = { 2, 7, 5, 8, 9, 5, 7, 5, 5, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("%d", unique(arr, n));
    return 0;
}

3 个答案:

答案 0 :(得分:4)

您需要检查整个数组(当前,您的内部循环最多只能运行i)。

    for (int j = 0; is_u && j < n; ++j)
    {
         /* i != j to avoid comparing an element with itself. */
         if (i != j && arr[j] == arr[i]) is_u = 0;
    }

您显然是O(n * n)算法。您可以排序并检查后续元素以在O(n log n)中执行相同的操作。

如果您可以使用额外的O(n)内存来使用辅助数组作为“计数器”,那么也可以以O(n)的时间复杂度来完成。

答案 1 :(得分:1)

此代码为您提供了数组中唯一编号的计数

#include <stdio.h>
#include <stdlib.h>


int unique(int *arr, int n)
{
     int u = 0;

     for (int i = 0; i < n; i++)
     {
        int is_u = 1;
        for (int j = 0; j < n; j++)
        {
            //printf("%d,%d\n", arr[i], arr[j]);
             if (arr[i] == arr[j] && i != j){ 
                 //printf("match %d\n", arr[i]);
                 is_u = 0; break;
             }
        }
        if (is_u) ++u;

        //printf("u %u \n",u);
     }
     return u;
}


int main(void) {
    int arr[] = { 2, 7, 5, 8, 9, 5, 7, 5, 5, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("%d", unique(arr, n));
    return 0;
}

此代码中使用了两个嵌套的for循环, 第一个for循环保存数组索引。第二个for循环,如果在数组中未找到相同的值(相同的索引除外),则将该索引值与所有数组值进行比较,然后以'u'递增。

答案 2 :(得分:1)

  • u不应初始化为1。您不知道是否有重复项。

此行

int u = 1;

应该是

int u = 0;

  • 数组基于0。

此行

for (int i = 1; i < n; ++i)

应该是

for (int i = 0; i < n; ++i) // NOTE i = 0 vs i = 1

  • 不限于i。您想扫描整个阵列以找到重复的

此行

for (int j = 0; is_u && j < i; ++j)

应该是

for (int j = 0; is_u && j < n; ++j) // NOTE j < n vs j < i

  • 进行辅助扫描时,您需要忽略当前索引。否则,所有元素都将被视为重复元素。

此行

if (arr[j] == arr[i]) is_u = 0;

应该是

if (j != i && arr[j] == arr[i]) is_u = 0; // NOTE added condition of j != i