网易有道的一道算法面试题

1、存在一个数组,数组大小为2n+1,里面有n对个数,加上另外一个单独出现的数,例如:1,2,2,3,1.(数组是无序的,考虑排序的话一定会超过限制)这5个数中的单独的数就是3,要你用你能想到的最高效率的方法找出来。这个绝对是个老题,old了啊,old了啊。大家很容易就想到将所有的数直接异或来获得答案,这绝对是个非常好的方法。


2、我也在面试中较快的想到了这个方法,但是当这个问题的进化版出现的时候,我愣了很久,问题改为数组的大小为2n+2,也就是说有两个只出现一次的数了。

举个例子,1,2,3,2,4,1,这个例子中,3,4这两个数字就是我们要找的数。此时我们继续沿着异或的思路找下去,我们得到一个结果,这个结果就是3,4两个数字,哪些位不同。这样我们将可以根据这个不同位来进行区分,我们为了简便选择最低位为1的一个数,例如此时,选择flag=001,此时遍历整个数组,初始化num1,num2为0,将每个元素与flag进行按位与操作,如果大于0,那么与num1异或,如果等于0,那么与num2异或。这样遍历一遍之后,那么num1,num2就是我们要找的这两个数了。


代码实现还是很简单,于是这里就不贴了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值