如何计算列表中唯一项目的数量?
例如说我有{1,3,3,4,1,3}我希望得到数字3,表示列表中唯一项目的数量(即| A | = 3,如果A = { 1,3,4})。有人会使用什么算法?
我尝试过双循环:
for firstItem to lastItem
currentItem=a
for currentItem to lastItem
currentItem=b
if a==b then numberOfDublicates++
uniqueItems=numberOfItems-numberOfDublicates
这不起作用,因为重复次数比实际需要的次数多。在开头的例子中,它将是:
关于如何解决这个问题的任何想法?
答案 0 :(得分:11)
将项目添加到HashSet,然后在完成后检查HashSet的大小
假设你有一个很好的哈希函数,那就是O(n)
。
答案 1 :(得分:6)
您可以查看该号码后面是否有重复项。如果不增加uniqueCount:
uniqueCount = 0;
for (i=0;i<size;i++) {
bool isUnique = true;
for (j=i+1;j<size;j++)
if (arr[i] == arr[j] {
isUnique = false;
break;
}
}
if(isUnique) {
uniqueCount ++;
}
}
以上方法的时间为O(N^2)
,空间为O(1)
。
另一种方法是对输入数组进行排序,将重复元素放在一起,然后查找相邻的数组元素。这种方法的时间为O(NlgN)
,空间为O(1)
。
如果允许您使用额外的空间,则可以使用哈希在O(N)
时间和O(N)
空间内完成此操作。哈希的关键是数组元素,值是它们的频率。
在哈希结束时,您只能获得值为1
的哈希键的计数。
答案 2 :(得分:2)
使用像mergesort或heapsort这样的合适排序算法对它进行排序(两者都是最坏情况下的O(n log n))并循环排序列表:
sorted_list = sort(list)
unique_count = 0
last = sorted_list[0]
for item in sorted_list[1:]:
if not item == last:
unique_count += 1
last = item
答案 3 :(得分:1)
list.sort();
for (i = 0; i < list.size() - 1; i++)
if (list.get(i)==list.get(i+1)
duplicates++;
答案 4 :(得分:0)
保持字典并在循环中添加计数
这就是它如何看待c#
int[] items = {1, 3, 3, 4, 1, 3};
Dictionary<int,int> dic = new Dictionary<int,int>();
foreach(int item in items)
dic[item]++
当然在C#中有LINQ方式,但据我所知,问题是一般的;)