我必须编写一个程序,在数组中找到重复项,并在数组中存在每个重复项的次数。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define DIM 5
int contains (int v[], int dim, int n);
int main(int argc, char** argv)
{
int i, j, k = 0, found;
int v[DIM];
int dup[DIM] = {0};
for (i = 0; i < DIM; i++)
{
printf("Insert element in the array: ");
scanf("%d", &v[i]);
}
for (i = 0; i < DIM; i++)
{
found = 0;
if (contains (dup, DIM, v[i]) == 0)
{
for (j = 0; j < DIM; j++)
{
if (v[i] == v[j] && (i != j))
{
found ++;
dup[k] = v[i];
k++;
}
}
if (found != 0)
{
printf("Element %d has been repeated %d times\n", v[i], found);
}
}
}
return (0);
}
int contains (int v[], int dim, int n)
{
int i;
int found = 0;
for (i = 0; i < dim; i++)
{
if (v[i] == n)
{
found = 1;
}
}
return found;
}
该计划运作良好,但我认为效率不高。当然,它有一种让程序高效的方法,不是吗?我的意思是继续使用数组而不是任何其他结构
答案 0 :(得分:1)
一个好的哈希表在线性时间内解决了这个问题。如果您不想使用数据结构,那么这是一个类似C的伪代码的O(n lg n)解决方案:
// given: an array a of n integers
sort(a, n);
for (int i = 0;;) {
int value = a[i];
int count = 0;
do {
i++;
count++;
} while (i < n && a[i] == value);
if (count > 1)
printf("Element %d has been repeated %d times\n", value, count);
}
可以使用qsort
进行排序。该算法的其余部分依赖于以下事实:在排序之后,所有重复项将被组合在一起。
答案 1 :(得分:0)
当你填充数组时,你应该对你的数组进行排序(用qsort示例),使用二分搜索找到你的数字,然后从索引中搜索是否有重复数据:
array:
0 1 2 5 7 7 48 48 56 72
您正在通过示例搜索7
。使用二分法搜索,您可以找到具有O(log n)复杂度的7
。让我们调用它的索引IDX(在这个例子中等于5)
数组:
0 1 2 5 7 7 48 48 56 72 103
^
|
IDX(=5)
现在你必须像这样循环:
int count = 0;
int idx = 5; // must be finded via a dichotomic search
int toFind = array[idx];
while (idx >= 0 && array[idx] == toFind)
{
++count;
--idx;
}
idx = 5:
while (idx < arrayLength)
{
++count;
++idx;
}
只有在您可以对数组进行排序以及是否要避免使用哈希表时,此解决方案才有效。
答案 2 :(得分:0)
如果您知道用户输入的数字范围,这是一个O(n)方法。假设您知道数字将在0-99范围内。
这是伪代码。
//Input the array elements in an array named arr[]
static int freq[101]; //create a static array to initialize all elements to 0
//scan the array arr and increment the counter at index of freq array
for(int i=0;i<(arr.length);i++)
freq[arr[i]]++;
//Now scan the array named freq and print the frequency of each of the numbers.
for(int i=0;i<101;i++)
if(freq[i]>0)
printf("Frequency of %d is:- %d ",i,freq[i]);
我希望这会对你有所帮助。
答案 3 :(得分:-1)
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,a[5];
clrscr();
printf( "Enter the element in array\n" );
for( i=0; i<5; i++ ) {
scanf( "%d", &a[i] );
}
for(i=0;i<5;i++) {
for(j=i+1;j<5;j++) {
if(a[j]==a[i])
printf("Repeated value is %d",a[i]);
}
}
getch();
}