您的位置:首页 > 职场人生

算法面试题:一个数出现一次,其他数出现N次

2016-04-18 22:08 351 查看
最常见的版本是:一个数出现一次,其他数出现2次,那么异或就行了,细推敲下,异或的性质,就是如果相同就结果为0  其实等价于对每个二进制位%2,那么类比开来,如果一个数出现一次,其他数出现N次,就是%N啊。细想想就明白是对的。

一个注意点是,最好用unsigned

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 3;
const int SIZE = 1001;
const int LEN = 32;

unsigned int nums[SIZE][LEN];

int findSingle( int n ) {
unsigned int ret[LEN], ptr=0;
for( int i=0;i<LEN;i++ ) {
ret[i] = 0;
for( int j=0;j<n;j++ ) {
ret[i] += nums[j][i];
}
ret[i] %= N;
}
unsigned int retV=0;
for( int i=LEN-1;i>=0;i-- ) {
retV = retV*2 + (bool)ret[i];
}
return retV;
}

int main() {
int n;
while( cin >> n ) {
int in;
for( int i=0; i<n; i++ ) {
cin >> in;
for( int j=0; j<LEN; j++ ) {
nums[i][j] = (1<<j)∈
}

}
cout << findSingle(n) << endl;
}
return 0;
}


代码测试可能不强,欢迎指正bug。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: