Ruby - 在数组中查找重复项

3
我正在尝试编写一个Ruby方法,它接受一个大小为N的数组,并查找数组中的重复项并列出这些重复项。
我在创建一个范围为0..N-2的数组时遇到了问题。
它告诉我N是未初始化的常量。我该如何创建这样的数组?

1
欢迎来到Stack Overflow。你尝试过写代码了吗?我们更愿意纠正你已经写的代码,而不是为你编写全新的代码。对你来说,纠正一些问题比插入与周围代码完全无关的新代码要容易得多。 - undefined
4个回答

11
这里有一个选项。
def list_duplicates(array)
  duplicates = array.select { |e| array.count(e) > 1 }
  duplicates.uniq
end

我在这里进行了测试

 list_duplicates([1,1,4,5,6,6,9]
 => [1,6]

3
这样操作可以行得通,但在更大的数组上运行时速度会几何级别地变慢。 - undefined
array.count遍历数组中的所有元素,就像select一样,所以对于一个包含500K个元素的数组来说,这可能会非常慢,因为它要执行2500亿次操作。在这种情况下,使用group_by进行一次遍历的方法可能更快。 - undefined

5
你可以始终使用一个简单的计数哈希:
def duplicate_count(array)
  array.each_with_object(Hash.new(0)) do |value, hash|
    # Keep a count of all the unique values encountered
    hash[value] += 1
  end.count do |(value,count)|
    # Compute how many have a count > 1
    count > 1
  end
end

duplicate_count([1,2,3,4])
# => 0

duplicate_count([1,2,2,3,4,4,2])
# => 2

如果您希望返回重复的值:

def duplicate_count(array)
  array.each_with_object(Hash.new(0)) do |value, hash|
    # Keep a count of all the unique values encountered
    hash[value] += 1
  end.each_with_object([ ]) do |(value,count), result|
    # Collect those with count > 1 into a result array.
    if (count > 1)
      result << value
    end
  end
end

2
您可以编写以下代码:
def duplicate_value(array)
  array.select{|v| array.count(v) > 1}.uniq
end

duplicate_value([1, 2, 1, 3, 3])
=> [1, 3]

0

我刚写了这个程序,它可以正常运行。我很想要一些反馈,所以在这里分享。

def duplicate_array(arr)
  duplicates = []
  while arr.size != 1
    pivot = arr.shift
    arr.each do |element|
      if element.eql?(pivot)
        next if duplicates.include?(element)
        duplicates << element
      end
    end
  end
  duplicates
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接