0

問題は、10個の整数の配列があり、いくつかの重複があることです。タスクは、この配列を同じサイズの別の配列にコピーすることですが、値が重複することはありません。つまり、array1 から 1 つの要素を読み取り、それを array2 のすべての要素と比較します。それが既に array2 にある場合は、それをスキップするか、既に array2 にあることを出力し、array1 の 2 番目の要素に移動して、プロセスを繰り返します。今、私はこれを試しましたが、どこに問題があるのか​​ わかりません:

#include <iostream>
using namespace std;

int main()
{
    int temp;

    int array1[] = {10,2,5,4,10,5,6,9,8,10};
    int array2[11] = {0};

    for(int i = 1; i <= 10; i++)
    {
            temp = array1[i-1];

            for(int j = 1; j <= 10; j++)
            {
                    if(temp == array2[j])
                    {
                            cout << "Duplicate " << temp << endl;
                            i++;
                            break;
                    }
            }

            array2[i] = array1[i-1];
    }

    for(int k = 1; k <= 10; k++)
            cout << array2[k] << "  " << endl;
system("pause");
}
4

7 に答える 7

3

array1には 10 個の要素があり、array211 個あるため、すぐには要件が満たされません。forおそらく、11 個の要素を持つことは、ループで不適切なインデックス値を使用するための回避策でした。インデックスは 1 から 10 ではなく、0 から 9 まで実行する必要があります。

2 番目の配列に要素を追加するときは、配列全体の値ではなく、既に追加されている要素に対してのみ値をチェックする必要があります。

最後に、仕様不足です。重複を排除すると、要素は 10 未満になります。array210 個の要素があります。余分な要素にはどのような値が必要ですか?

于 2013-07-10T14:37:03.187 に答える
1

std::unique_copy はあなたの友達です: http://en.cppreference.com/w/cpp/algorithm/unique_copy

最初にソース配列をソートすることを忘れないでください

于 2013-07-10T14:36:31.110 に答える
0

C++ では、break1 つのループ構造をすぐに終了し、その直後に実行を開始します。したがって、内側のループが重複を検出するarray2[i] = array1[i-1];かどうかに関係なく、この行は実行されます。for1 つの解決策は、値が重複していることを示す変数を設定することです。

 int main() {
     int temp;
     bool isDuplicate; //added this line

     int array1[] = {10,2,5,4,10,5,6,9,8,10};
     int array2[11] = {0};

     for(int i = 1; i <= 10; i++)
     {
             temp = array1[i-1];
             isDuplicate=false;//added this line
             for(int j = 1; j <= 10; j++)
             {
                     if(temp == array2[j])
                     {
                             cout << "Duplicate " << temp << endl;
                             i++;
                             isDuplicate=true; //added this line
                             break;
                     }
             }
             if(!isDuplicate) //added this line
             array2[i] = array1[i-1];
     }

     for(int k = 1; k <= 10; k++)
             cout << array2[k] << "  " << endl; system("pause"); }

goto別の方法として (多くのプログラマーはこの慣行に同意しませんが)、ステートメントの代わりにステートメントを使用できますbreak

int main()
{
    int temp;

    int array1[] = {10,2,5,4,10,5,6,9,8,10};
    int array2[11] = {0};

    for(int i = 1; i <= 10; i++)
    {
            temp = array1[i-1];

            for(int j = 1; j <= 10; j++)
            {
                    if(temp == array2[j])
                    {
                            cout << "Duplicate " << temp << endl;
                            i++;
                            goto duplicate; //added this line
                    }
            }

            array2[i] = array1[i-1];
            //added next line
            duplicate:
    }

    for(int k = 1; k <= 10; k++)
            cout << array2[k] << "  " << endl;
system("pause");
}
于 2013-07-10T14:40:32.407 に答える
0

std::set を使用して一意性を確保できます。

http://en.cppreference.com/w/cpp/container/set

于 2013-07-10T14:42:38.477 に答える
0

私はあなたのコードの問題の2つの主な原因を見ることができますbreak. 2) これまでに配列 2 に挿入された要素の数を格納するカウンターがないため、配列 2 に隣り合ってコピーすることはできませんでした。両方を修正するコードは次のとおりです。

#include <iostream>
using namespace std;

int main()
{

  int array1[] = {10,2,5,4,10,5,6,9,8,10};
  int array2[10];

  int array2_elements_inserted = 0; 

  for(int i = 0; i < 10; i++)
    {
      int temp = array1[i];

      bool isDuplicate = false; 
      for(int j = 0; j < array2_elements_inserted; j++)
        {
          if(temp == array2[j])
            {
              cout << "Duplicate " << temp << endl;
              isDuplicate = true; 
              break;
            }
        }

      if (!isDuplicate)
        {
          array2[array2_elements_inserted] = temp;
          ++array2_elements_inserted; 
        }
    }

    for(int k = 0; k < array2_elements_inserted; k++)
        cout << array2[k] << "  " << endl;
  //  system("pause");
}

出力:

10  
2  
5  
4  
6  
9  
8  
于 2013-07-10T14:42:45.577 に答える
0

次の 3 つの方法があります。

  • 各要素を 1 つずつ比較 (O(N^2)パフォーマンス)
  • 参照配列を並べ替え、バイナリ検索を使用して要素が存在するかどうかを判断します (O(N*lnN)パフォーマンス)
  • ルックアップ ハッシュを作成する (O(1)パフォーマンス)
于 2013-07-10T14:36:17.423 に答える
-1

まず、動的コンテナーを使用します。特に、標準ライブラリによって提供されるものを見てくださいstd::vector。次に、セット データ構造を使用して、以前に見た要素を追跡する必要がありますstd::set

次に、入力配列の反復と、新しい要素を出力配列に追加するだけです。

次に例を示します。

#include <vector>
#include <set>
#include <iostream>

int main() {
    // define and print input data
    std::vector<int> v1 = {10,2,5,4,10,5,6,9,8,10};
    for (int i : v1) 
        std::cout << i << " ";
    std::cout << "\n";
    // this will soon contain the output data
    std::vector<int> v2;
    // a set to keep track of the already seen elements 
    std::set<int> set;
    // iterate the input array using range-based for loop
    for (int i : v1) {
        // check for duplicates
        if (set.find(i) == set.end()) {
            // first occurrence, insert to set, append to output data
            set.insert(i);
            v2.push_back(i);
        }
        else {
            // seen before, do nothing
        }
    }
    // print output data
    for (int i : v2) 
        std::cout << i << " ";
    std::cout << "\n";    
}

出力:

$ g++ test.cc -std=c++11 && ./a.out
10 2 5 4 10 5 6 9 8 10 
10 2 5 4 6 9 8 

参考のため:

于 2013-07-10T14:54:41.757 に答える