1. ホーム
  2. ruby

[解決済み] 配列の中から重複する値を探して返す方法

2022-04-13 16:13:41

質問

arr は文字列の配列です。

["hello", "world", "stack", "overflow", "hello", "again"]

をチェックする簡単でエレガントな方法は何でしょうか? arr が重複している場合、そのうちの1つを返す(どれでもよい)?

["A", "B", "C", "B", "A"]    # => "A" or "B"
["A", "B", "C"]              # => nil

解決方法は?

a = ["A", "B", "C", "B", "A"]
a.detect{ |e| a.count(e) > 1 }


これはあまりエレガントな答えではないのですが、私はこれが大好きです。美しいワンライナー・コードです。巨大なデータセットを処理する必要がない限り、全く問題なく動作します。

より速い解決策をお探しですか?はい、これです

def find_one_using_hash_map(array)
  map = {}
  dup = nil
  array.each do |v|
    map[v] = (map[v] || 0 ) + 1

    if map[v] > 1
      dup = v
      break
    end
  end

  return dup
end

線形でO(n)ですが、複数のコード行を管理する必要があり、テストケースが必要など。

さらに高速なソリューションが必要な場合は、代わりにC言語を試してみるといいかもしれません。

そして、異なるソリューションを比較する要点は以下の通りです。 https://gist.github.com/naveed-ahmad/8f0b926ffccf5fbd206a1cc58ce9743e