博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用位操作
阅读量:7045 次
发布时间:2019-06-28

本文共 1025 字,大约阅读时间需要 3 分钟。

见朋友出了问题,最近访问技术论坛时,大致是这样的:有一组。其中包括:N整数,除了的整数只有一次以外,其他已经出现3二级。如何找到只出现一次最快的数?

作者的解法有点忘记了。可是这个题突然让我想起之前《编程之美》里的一道题, 和这个题的差别是其它都出现2次,仅仅有一个是出现一次。

它的解法很巧妙。就是把全部整数进行异或运算,最后的结果就是仅仅出现一次的那个整数。由于异或会把相同的消除掉。可是这个题是出现3次。异或已经解决不了。第一想法是空间换时间,全部数中取最大值Max,然后定义一个数组int hashArr[Max],运用hash的思想。遍历全部整数进行hashArr[i]++运算。最后再找出hashArr[i]为1的,下标值就是所求的数。这个解法相同适用于其它出现N次的情况。解法时间复杂度为O(N),空间额外开销为S(MAX)

可是我们能够继续深入分析。以32bit整数为例。假设把全部数的第i个比特位相加,假如和为sum。则会有例如以下等式:3(x1 + x2 + ... + xn) + x0 = sum (x1代表第一个数的第i个比特位的值 X0代表仅仅出现一次整数的第i个比特位的值) 从这个等式中能够看出x0的值为sum/3的余数。由于x0不是1就是0。肯定小于3。所以我们能够有例如以下的代码:

int arr[N] = {};int _tmain(int argc, _TCHAR* argv[]){	int nMask = 1;	int nBitSum = 0;	int nDst = 0;	for (int i = 0; i < 32; ++i)	//依次推断32位	{		for (int j = 0; j < N; ++j)	 //对N个数的第i位求和		{			if (arr[j] & nMask)			{				nBitSum++;			}		}		if (nBitSum%3 != 0)		//余数不是1就是0		{			nDst |= nMask;		}		nMask <<= 1;
nBitSum = 0;	}	return nDst;}

 
这样就把仅仅出现一次的数求出来了,并且假设其它数出现的次数是M次的话,mod M就能够了。时间复杂度是O(32*N),  空间额外开销就是几个成员变量。

相比較而言还下面的算法是较好,当然,还详细介绍了情况而定。

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
TOP 13大最热开源微服务Java框架
查看>>
Swift 3来了!
查看>>
京东构建了全球最大的Kubernetes集群,没有之一
查看>>
Node项目之需求收集平台(一)- 基本介绍
查看>>
ArchSummit北京2015 | “新人”的技术约战
查看>>
Microsoft宣布正式发布Linux on ASE
查看>>
Elm提供的语言级响应性
查看>>
微服务通信策略
查看>>
InfoQ 趋势报告:技术文化\u0026方法2019年实践状况
查看>>
Entity Framework Core 2.0的槽点
查看>>
甲骨文解散Java Mission Control团队事件新进展
查看>>
书评:实战Apache JMeter
查看>>
2014年基于Raspberry Pi的5大项目
查看>>
[deviceone开发]-openPage的动画效果示例
查看>>
EAGLEPCB7.7 gerber文件导出
查看>>
苏宁11.11:苏宁易购移动端的架构优化实践
查看>>
GitHub推出Scientist,帮助开发者重构关键路径代码
查看>>
力荐!这些工具可以帮你写出干净的代码
查看>>
优化typecho性能,使typecho可以流畅支持200w posts
查看>>
UITableView基础[ 3 ] 使用UIRefreshControl实现下拉刷新功能
查看>>