5

さて、配列内にいくつの異なる数値があるかを見つけなければなりません。

たとえば、配列が次の場合: 1 9 4 5 8 3 1 3 5

1、9、4、5、8、3 は一意であり、1、3、5 は繰り返し (一意ではない) であるため、出力は 6 になるはずです。

だから、これまでのところ私のコードです.....正しく動作していないと思いました。

#include <iostream>

using namespace std;

int main() {
    int r = 0, a[50], n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < j; k++) {
            if (a[k] != a[j]) r++;
        }
    }
    cout << r << endl;
    return 0;
}
4

8 に答える 8

13

パーティーに参加させてください;)

ハッシュテーブルを使用することもできます:

#include <unordered_set>
#include <iostream>

int main() {

    int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };
    const size_t len = sizeof(a) / sizeof(a[0]);

    std::unordered_set<int> s(a, a + len);

    std::cout << s.size() << std::endl;
    return EXIT_SUCCESS;

}

ここで問題になるわけではありませんが、これは大規模な配列で最高のパフォーマンスを発揮する可能性があります。


最小要素と最大要素の差がかなり小さい場合は、さらに高速に実行できます。

  • 最小要素と最大要素の間の範囲にまたがるa を作成しますvector<bool>(コンパイル時に配列要素がわかっている場合は、std::bitset代わりにそれをお勧めしますが、とにかくテンプレート メタプログラミングを使用してコンパイル時にすべてを計算することができます)。
  • 入力配列の各要素に対して、対応するフラグを に設定しvector<bool>ます。
  • 完了したら、true内の の数を数えるだけvector<bool>です。
于 2013-02-06T23:49:10.533 に答える
10

Astd::setにはすでに一意の要素のみが含まれています。

#include <set>

int main()
{
    int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };

    std::set<int> sa(a, a + 9);
    std::cout << sa.size() << std::endl;
}
于 2013-02-06T23:38:29.087 に答える
4

これはどう?

#include <list>

int main()
{
    int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5};

    std::list<int> la(a, a+9);
    la.sort();
    la.unique();
    std::cout << la.size() << std::endl;

    return 0;
}
于 2013-02-06T23:35:29.967 に答える
1

標準ライブラリを使用できず、ループを使用する必要があると述べたので、代わりにこのソリューションを試してみましょう。

#include <iostream>

using namespace std; // you're a bad, bad boy!

int main() 
{
    int r = 0, a[50], n;

    cout << "How many numbers will you input? ";
    cin >> n;

    if(n <= 0)
    {
        cout << "What? Put me in Coach. I'm ready! I can do this!" << endl;
        return -1;
    }

    if(n > 50)
    {
        cout << "So many numbers! I... can't do this Coach!" << endl;
        return -1;
    }   

    cout << "OK... Enter your numbers now." << endl;

    for (int i = 0; i < n; i++)
        cin >> a[i];


    cout << "Let's see... ";

    // We could sort the list but that's a bit too much. We will choose the
    // naive approach which is O(n^2), but that's OK. We're still learning!

    for (int i = 0; i != n; i++) 
    { // Go through the list once.      
        for (int j = 0; j != i; j++)
        { // And check if this number has already appeared in the list:
            if((i != j) && (a[j] == a[i]))
            { // A duplicate number!        
                r++; 
                break;
            }
        }
    }

    cout << "I count " << n - r << " unique numbers!" << endl;

    return 0;
}

このコードを宿題として提出しないことを強くお勧めします - 少なくとも理解せずに。あなたは自分自身に不利益を与えるだけであり、インストラクターはあなたがそれを書いていないことを知っている可能性があります: 私は以前に採点者でした.

于 2013-02-07T00:13:10.817 に答える
0

rの値を大きくする場所が間違っていると思います

#include <iostream>
using namespace std;

int main()
{
    int r=0,a[50],n;
    cin >>n;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
    }
    for (int j=0;j<n;j++)
    {   
        bool flag = true;  
        for(int k=;k<j;k++)
        {
            if(a[k]!=a[j])
            {
               flag = false;
               break;
            }
       }
       if (true == flag) 
       {
           r++;
       }
    }
    cout << r << endl;
    return 0;
}

ただし、私の提案は、より洗練されたアルゴリズムを使用することです (このアルゴリズムは O(N^2) です)。

于 2013-02-06T23:39:51.220 に答える
0

これは機能するはずですが、おそらく最適なソリューションではありません。

#include <iostream>

using namespace std;

int main()
{
int a[50],n;        
int uniqueNumbers; // this will be the total numbers entered and we will -- it
cin >>n;    
uniqueNumbers = n;  
for(int i=0;i<n;i++)
{
    cin >> a[i];
}   
for (int j=0;j<n;j++)
{   
    for(int k=0;k<n;k++)
    {
        /* 
        the and clause below is what I think you were missing.
        you were probably getting false positatives when j == k because a[1] will always == a[1] ;-)
        */
        if((a[k] == a[j]) && (k!=j)) 
        { uniqueNumebers--; }
    }       
}
cout << uniqueNumbers << endl;
return 0;
}
于 2013-02-06T23:56:18.150 に答える