2017-07-16 31 views
-3

まあこんにちは 配列が与えられたとしましょう[1,5,3,6,7,3,67,54] すべての要素が1つの要素はこの場合3です。手近な課題はこの要素を見つけることであり、配列のサイズに等しいループ用のものだけを使うことが許されています。配列の繰り返し要素を1つのループの中で見つける

PS: ハッシュマップを使用することをお勧めしますが、配列のトラバーサルが終了した後に、どのキーが値2を持つかを調べるためにハッシュマップをトラバースする必要があります。許可されます。

どうすればよいですか?

+4

これまでにお試しいただいた内容をお見せください!なぜあなたはハッシュマップを反復処理する必要がありますか? – chtz

+1

@ KostasRim並べ替えは少なくとも配列をスキャンするほど高価であり、ソリューションが2つのループより悪くなります。 –

+0

これは重複のように見えます:https://stackoverflow.com/q/44637670/1632887 – seleciii44

答えて

4

ハッシュマップで問題を解決することができます。実際には、それ以上のものが必要です。 unordered_setを使用します。値がセット内に存在しない場合、配列を走査します。それ以外の場合は、重複した値が見つかりました。

--EDIT--

[OK]を、私たちの一つは、それは確かだ、他のを理解していません。あなたの質問から私が理解しているところによるが、以下はセットを使ったサンプルソリューションです。私がまだ誤解していると思われる場合は、問題の詳細をお知らせください。

#include<vector> 
#include<iostream> 
#include<unordered_set> 

bool repeating(const std::vector<int> &vec, int &repeatingValue) 
{ 
    std::unordered_set<int> set; 
    for(auto x: vec) 
    { 
     if(set.count(x)) 
     { 
      repeatingValue = x; 
      return true; 
     } 
     set.insert(x); 
    } 
    return false; 
} 

int main() 
{ 
    std::vector<int> v{1,5,3,6,7,3,67,54}; 

    int repeatingValue; 
    if(repeating(v, repeatingValue)) 
     std::cout<<repeatingValue<<std::endl; 
    else 
     std::cout<<"No repeating value detected!" << std::endl; 

    return 0; 
} 
+0

ループのために1つだけを使用するというサイドノートをお読みください 値がセットに存在するかどうか毎回チェックすると、別のforループを使用してセットをトラバースする – shourabh

+0

@shourabhあなたは2回横断する必要はありません。挿入する前に値がセットに存在するかどうかをチェックするだけです。 – seleciii44

+0

値が存在するかどうかを確認する方法を教えてください。すべての可能なセット要素を横断することによって、正しいでしょうか? – shourabh

関連する問題