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


最常见的版本是:一个数出现一次,其他数出现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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值