Problem:
给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。
如:{1, 2, 1, 2, 1, 2, 7},找出 7。
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
Analyze:
我们将序列转换成二进制
可以得到 01,10,01,10,01,10,111.
将其累加,对每一位对3求余。
也就是 存在如下的状态
00 ➞ 01 ➞ 10 ➞ 00 ( 11 mod 3 = 00 )
那么 让 f1 , f2 表示 状态 ,每次进行 +1 操作可得到算法
f2 = f2 xor arr_tmp & ~f1;
f1 = f1 xor arr_tmp & ~f2;
Code:
#include <iostream>
using namespace std;
int get_single_number(int * arr, int len)
{
int lo=0,hi=0;
for (int i = 0; i < len; ++i) {
lo = ( lo ^ *(arr+i) ) & ~hi;
hi = ( hi ^ *(arr+i) ) & ~lo;
}
return lo;
}
int main()
{
int n,ans;
cin >> n;
int _data[n];
for (int i = 0 ; i < n ; ++i) {
cin >> _data[i];
}
ans = get_single_number(_data, n);
cout << ans << endl;
return 0;
}