データ構造の面接問題のまとめ2——配列:出現回数が半分を超える要素を求めます.
この問題に遭遇する一番簡単な考えは、各要素の出現回数を統計することです.しかし、配列の中にいくつの要素があるかは分かりません.他の記憶空間を使って、結果を検索する時も、結果の行列を巡回する必要があります.
正しい解決方法は重複要素(結果要素)の数を記録し、異なる要素に出会うとマイナス(相殺に相当)になり、結果要素に出会うのも同じです.
考えてみると、結果の要素は半分以上になりますので、すべての要素が相殺されたら、必ず結果の要素が残ります.
この方法は一次配列のみを巡回した.
正しい解決方法は重複要素(結果要素)の数を記録し、異なる要素に出会うとマイナス(相殺に相当)になり、結果要素に出会うのも同じです.
考えてみると、結果の要素は半分以上になりますので、すべての要素が相殺されたら、必ず結果の要素が残ります.
この方法は一次配列のみを巡回した.
int FindNum(int *a, int n)
{
int result = a[0];
int result_count = 1;
for (int i = 1; i < n; i++)
{
if (a[i]==result)
{
result_count++;
}
else
{
result_count--;
if (result_count==0)
{
result = a[i];
result_count = 1;
}
}
}
return result;
}