0

配列内の最初に(最初に出会った、左から右へ)非繰り返し要素を返したいと思います。

配列内で繰り返されない最小の整数を非常に簡単に返すアルゴリズムが付属しており、配列内の最大整数値の長さを持つ余分なスペースとして配列のみを使用します。

// smallest non repeating integer

int firstNonRepeatingInteger(int* input, int n)
{

     max = std::numeric_limits<int>::min() ;

     for(int i = 0 ; i < n ; i++)
     {
        if(input[i] > max)  
            max = input[i];
     }

     int* count = new int[max];

     for(int i = 0 ; i < n ; i++)
          count[input[i]] += 1 ;

     int j = 0;
     while(count[i] != 1)
       j++ ; 

     if(j < n)
        return input[count[j]] ;
     else
        return -1 ;

}

ただし、整数に遭遇した時間を格納する別のn配列がある場合を除いて、最初に出会ったアルゴリズムを見つけることができません。

何か案が ?最初のアルゴリズムの他の実装はありますか?

ありがとう

4

1 に答える 1

4

あなたはほとんどそれを持っていました:

#include <limits>
#include <iostream>

int firstNonRepeatingInteger(int* input, int n)
{
  int min = std::numeric_limits<int>::max() ;
  int max = std::numeric_limits<int>::min() ;

  // Find min/max values in input array.
  for(int i = 0; i < n; ++i)
  {
    if (input[i] > max)
      max = input[i];
    if (input[i] < min)
      min = input[i];
  }

  int* count;
  if (max - min + 1 > n)
  {
    count = new int[max - min + 1];
    // count has more elements than input, so only initialize
    // those elements which will be used.
    for(int i = 0; i < n; ++i)
      count[input[i] - min] = 0;
  }
  else
  {
    // Just initialize everything which is more efficient if
    // count has less elements than input.
    count = new int[max - min + 1]();
  }

  // Count number of occurrences.
  for(int i = 0; i < n; ++i)
    ++count[input[i] - min];

  // Find first non repeating element and return its index,
  // or -1 if there is none.
  int index = -1;
  for (int i = 0; i < n; ++i)
  {
    if (count[input[i] - min] == 1)
    {
      index = i;
      break;
    }
  }
  delete[] count;
  return index;
}

int main()
{
  int values[5] = {-2, 4, 6, 4, -2};
  int index = firstNonRepeatingInteger(values, 5);
  if (index >= 0)
  {
    std::cout << "Found first non repeating integer " << values[index] <<
      " at index " << index << "." << std::endl;
  }
  else
    std::cout << "Found no non repeating integer in array." << std::endl;
  return 0;
}

コードにはいくつかの問題があることに注意してください。

  • 割り当てられたメモリを削除したことはありません。
  • new int[max]配列をゼロで初期化しません。new int[max]()代わりに使用する必要があります。すべての要素をゼロに設定する空の括弧に注意してください(ISO C ++ 03 5.3.4 [expr.new] / 15を参照)。
  • 入力配列に負の値があると、メモリアクセス違反が発生します。
于 2012-10-07T19:45:35.983 に答える