-4

サイズが n で、値の範囲が 0 から n-1 の配列があるとします。別の配列を使用せずに、値の重複がないことを検証する関数が必要です。

プロトタイプ: bool UniqueValues(unsigned arr[], size_t n);

これは就職面接のアルゴリズムに関する質問です。組み込みの std 関数の使用を提案しないでください。

4

3 に答える 3

4

配列をトラバースし、各要素について、arr[i] のインデックスで arr[i] を arr と交換します (たとえば、arr[1]=2 の場合、arr[2] と交換するので、arr[2]=2)。 . 値が重複しているかどうかは、arr[ arr[i] ] == arr[i] です。(arr [2]にすでに2があるときに、どこかに2が見つかりました)。

bool UniqueValues(unsigned arr[], size_t n)
{
    int val;
    for(size_t i=0;i<n;i++)
    {
        val = arr[i];
        if(val == arr[val] )  { if( val != i) return false; }  //  If the element is duplicated
        else {
            swap( arr[i], arr[val] );  //  Move the element to the index matching its value
            val = arr[i];
            if(val == arr[val] )  return false;  //  Another check for the swapped element
        }
    }
    return true;
}
于 2012-12-27T19:21:27.310 に答える
1

簡単なテストは、配列内の数値を合計してから、添字を合計することです。2 つが等しくない場合は、重複している可能性があります。

より強力なステートメントについては、配列をソートします。値は添字と一致する必要があります。

于 2012-12-27T19:26:38.463 に答える
1

1つの解決策は(疑似コード)

loop from i = 0 while i is smaller than length of array {
  loop from j = i + 1 while j is smaller than length of array {
    if array at index i equals array at index j {
      duplicate found. terminate the algorithm
    }
  }
}

no duplicate found. 
于 2012-12-27T19:27:56.340 に答える