5

手始めに、私はこれらの質問を見ました:

一部の数値が1回繰り返され、一部の数値が2回繰り返され、1つの数値のみが3回繰り返される整数の配列が与えられた場合、3回繰り返される数値をどのように見つけますか

ソートせずに、配列内の2つの繰り返される数値を見つけるアルゴリズム

これは違う:

1つの一意の番号を持ち、残りの番号が3回繰り返される、ソートされていない整数の配列が与えられます。つまり、次のようになります。

  {4,5,3,  5,3,4, 1, 4,3,5 }

O(n)時間とO(1)空間でこの一意の数を見つける必要があります

注:これは宿題ではありません。出くわしたいい質問です。

4

2 に答える 2

9

これはどうですか:

アイデア: ビット単位の加算 mod 3 を行う

#include <stdio.h>

int main() {
    int a[] = { 1, 9, 9, 556, 556, 9, 556, 87878, 87878, 87878 };
    int n = sizeof(a) / sizeof(int);
    int low = 0, up = 0;

    for(int i = 0; i < n; i++) {
        int x = ~(up & a[i]);
        up &= x;
        x &= a[i];
        up |= (x & low);
        low ^= x;
    }
    printf("single no: %d\n", low);
}
于 2012-08-09T12:55:58.647 に答える