我尝试编写代码以计算给定数组中不同唯一元素的数量,但是却得到了不希望的输出。{ 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;
}
答案 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;
此行
for (int i = 1; i < n; ++i)
应该是
for (int i = 0; i < n; ++i) // NOTE i = 0 vs i = 1
此行
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