有人可以给我一个算法来计算一次通过的整数数组的不同元素。
例如,我可以尝试使用for循环遍历数组我将第一个元素存储在另一个数组中。后续元素将与第二个数组中的元素进行比较,如果它是不同的,那么我将把它存储在该数组中并递增计数器。
有人可以给我一个比这更好的算法。
使用c和c ++
答案 0 :(得分:1)
假设您的元素是整数且其值介于0
和MAXVAL-1
之间。
#include <stdio.h>
#include <string.h>
#define MAXVAL 50
unsigned int CountDistinctsElements(unsigned int* iArray, unsigned int iNbElem) {
unsigned int ret = 0;
//this array will contains the count of each value
//for example, c[3] will contain the count of the value 3 in your original array
unsigned int c[MAXVAL];
memset(c, 0, MAXVAL*sizeof(unsigned int));
for (unsigned int i=0; i<iNbElem; i++) {
unsigned int elem = iArray[i];
if (elem < MAXVAL && c[elem] == 0) {
ret++;
}
c[elem]++;
}
return ret;
}
int main() {
unsigned int myElements[10] = {0, 25, 42, 42, 1, 2, 42, 0, 24, 24};
printf("Distincts elements : %d\n", CountDistinctsElements(myElements, 10));
return 0;
}
输出:(Ideone link)
区分元素:6
答案 1 :(得分:0)
维护一系列结构。 结构应该有一个值和该值的计数器。 在测试的数组中传递一个新元素后,立即创建一个带有值的结构,并将计数器递增1.如果您传递了数组中的现有元素,则只需访问相关结构并将其计数器递增1。 最后,在完成数组的一次完整传递后,您将在结构数组中获得所需的结果。
答案 2 :(得分:0)
编辑:我不知道您只想计算元素。更新了以下代码。
int countUnique()
{
uniqueArray[numElements];
myArray[numElements];
int counter = 0;
int uniqueElements = 0;
for(int i = 0; i < numElements; i++)
{
element tempElem = myArray[i];
if(!doesUniqueContain(tempElem, counter, uniqueArray)//If it doesn't contain it
{
uniqueArray[counter] = tempElem;
uniqueElements++;
}
}
return uniqueElements;
}
bool doesUniqueContain(element oneElement, int counter, array *uniqueArray)
{
if(counter == 0)
{
return false; //No elements, so it doesn't contain this element.
}
for(int i = 0; i < counter; i++)
{
if(uniqueArray[i] == oneElement)
return true;
}
return false;
}
这只是为了让你看到逻辑
答案 3 :(得分:0)
如何使用哈希表(在Java HashMap或C#Dictionary意义上)来计算元素?基本上,您创建一个空哈希表,其中数组元素类型为键类型,计数为值。然后你迭代你的列表。如果元素尚未在哈希表中,则使用count 1添加它,否则增加该元素的计数。