Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组中不同的唯一元素_C_Arrays - Fatal编程技术网

C 数组中不同的唯一元素

C 数组中不同的唯一元素,c,arrays,C,Arrays,我试图编写代码来计算给定数组中不同唯一元素的数量,但我得到了不想要的输出。{2,7,5,8,9,5,7,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 <

我试图编写代码来计算给定数组中不同唯一元素的数量,但我得到了不想要的输出。
{2,7,5,8,9,5,7,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;
}
#包括
#包括
int唯一(int*arr,int n)
{
INTU=1;
对于(int i=1;i
您需要检查整个阵列(当前,您的内部循环仅限于
i

for(int j=0;is_&&j
你的算法显然是O(n*n)算法。您可以对后续元素进行排序和检查,以便在O(n logn)中执行相同的操作


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

此代码为您提供数组中唯一数字的计数

#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;
}
#包括
#包括
int唯一(int*arr,int n)
{
int u=0;
对于(int i=0;i
此代码中使用的两个嵌套for循环, 第一个for循环保存数组索引。第二个for循环将该索引值与所有数组值进行比较,如果在数组中找不到相同的值(除了相同的索引),则以“u”递增。

  • u
    不应初始化为1。你还不知道是否有重复的
这条线

int u = 1;
for (int i = 1; i < n; ++i)
for (int j = 0; is_u && j < i; ++j)
if (arr[j] == arr[i]) is_u = 0;
应该是

int u = 0;
for (int i = 0; i < n; ++i) // NOTE i = 0 vs i = 1
for (int j = 0; is_u && j < n; ++j) // NOTE j < n vs j < i
if (j != i && arr[j] == arr[i]) is_u = 0; // NOTE added condition of j != i

  • 数组是基于0的
这条线

int u = 1;
for (int i = 1; i < n; ++i)
for (int j = 0; is_u && j < i; ++j)
if (arr[j] == arr[i]) is_u = 0;
应该是

int u = 0;
for (int i = 0; i < n; ++i) // NOTE i = 0 vs i = 1
for (int j = 0; is_u && j < n; ++j) // NOTE j < n vs j < i
if (j != i && arr[j] == arr[i]) is_u = 0; // NOTE added condition of j != i

对数组进行排序(如果可以修改的话,可以在适当的位置进行排序),这样很容易找到重复的数组并将其删除。代码似乎按照设计工作-数组中有6个不同的数字,我建议您解决问题。您的问题解决了吗?如果您使用数组作为计数器,那么它将是O(max\u元素)。如果数组的值本身不是
O(n)