找到重复数字的重复

时间:2010-11-20 06:41:41

标签: data-structures

这是我和我的朋友写的算法(在stackoverflow网站上) 这个算法只会找到第一个重复的数字并返回它。这可以在O(n)中使用 我想完成这个算法,帮助我重复输入重复的数字。认为我有[1,1,3,0,5,1,5] 我希望此算法返回2个重复的数字,1 and 5的重复次数分别为3 and 2。我可以用O(n)做什么?

1   Algorithm Duplicate(arr[1:n],n)
2   
3   {
4      Set s = new HashSet();i:=0;
5      while i<a.size() do
6      {
7          if(!s.add(a[i)) then
8          {
9             return a[i]; //this is a duplicate value!
10            break;
11         }
12         i++;
13      } 
14   }

3 个答案:

答案 0 :(得分:1)

您可以在Java中执行此操作:

List<Integer> num=Arrays.asList(1,1,1,2,3,3,4,5,5,5);
    Map<Integer,Integer> countNum=new HashMap<Integer, Integer>();
    for(int n:num)
    {
        Integer nu;
        if((nu=countNum.get(n))==null)
        {
            countNum.put(n,1);
            continue;
        }
        countNum.put(n,nu+1);
    }

不是每次都要迭代以获得重复次数,而是最好将计数存储在地图中。

答案 1 :(得分:0)

  1. 使用地图/字典数据结构。
  2. 对列表进行迭代。
  3. 对于列表中的每个项目,执行地图查找。如果键(项)存在,则递增其值。如果密钥不存在,请插入密钥和初始计数。

答案 2 :(得分:0)

在这个特定的例子中,它不是关于算法,而是关于数据结构:Multiset就像Set,除了它不存储唯一的项目,而是存储一个每个项目在Multiset中的频率计数。基本上,Set会告诉您特定项目是否在Set Multiset此外还会告诉您多久一次该特定项目位于Multiset

因此,基本上您所要做的就是从Multiset构建Array。这是Ruby中的一个例子:

require 'multiset'

print Multiset[1,1,3,0,5,1,5]

是的,这就是它的全部。这打印:

#3 1
#1 3
#1 0
#2 5

如果您只想要实际重复,只需delete计数小于2的项目:

print Multiset[1,1,3,0,5,1,5].delete_with {|item, count| count < 2 }

只打印

#1 3
#2 5

正如@suihock提到的那样,你也可以使用Map,这基本上只意味着代替Multiset处理元素计数,你必须自己做:

m = [1,1,3,0,5,1,5].reduce(Hash.new(0)) {|map, item| map.tap { map[item] += 1 }}
print m
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }

同样,如果您只想要重复项:

print m.select {|item, count| count > 1 }
# { 1 => 3, 5 => 2 }

但是如果不是自己计算,你可以使用Enumerable#group_by自己对元素进行分组,然后将分组映射到它们的大小。最后,转换回Hash

print Hash[[1,1,3,0,5,1,5].group_by(&->x{x}).map {|n, ns| [n, ns.size] }]
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }

所有这些都具有Θ(n)的摊销的最坏情况步骤复杂度。