算法整理——2017欢聚时代校招编程题

题目

给定一个无序整数数组,其中一个数只出现一次,其余数都出现三次,请找出只出现一次的那个数。

输入:第一行输入一个数N,表示数组的大小,接下来输入N个数,确保每个数都在int范围内。

输出:只出现一次的数。


思路

如果这道题描述的是其余数都出现2次,相信很多人都能够想到将所有数一起异或,最后的结果将是要求的那个数。但是这里讲的是出现三次,所以并不能用异或的方法将其余数抵消掉。这里可以用到二进制计数方法:由于题目明确了数的范围在int内,我们可以定义有32个元素的数组,然后将输入数组的每个数都化成二进制的形式。当某个位上的值为1时,在对应的数组上计数加1。所有的数都处理完毕之后,将这些计数数组都执行模3操作,此时计数数组上等于1的元素组成了题目要求的数。



代码

#include <iostream>

using namespace std;

int bits[32];

int main(){
	int n, num;
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> num;
		for(int j=0; num; j++){
			bits[j] += num & 1;
			num >>= 1;
		}
	}

	int result = 0;
	for(int i=31; i>=0; i--){
		result <<= 1;
		result += bits[i] % 3;
	}
	cout << result << endl;

	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值