对数器,异或运算实践的理解记录

好久没写过笔记了,最近又在看数据结构和算法,看到一个大神的课程,东西太厉害了,忍不住记录一波,害怕以后忘记了。

首先是对数器这一概念:就是当你写了一个针对数组排序的算法,你想测试它对不对,针对不同的数据构成方式或者其他情况,准确性是否有保证。你可以再写一个能一眼看出来的,就是那种暴力的解法,遍历整个数组进行比较或者排序这种的,第二种方法要能保证他的准确性,也可以使用官方给出的排序算法,比如java自带的sort()排序方法,然后再写一个获得随机数组的方法,获得一个随机数组,用这两种方法分别去跑,再把结果进行比较,看看自己想测的第一种方法是否正确,这样测试很多很多次,如果中间出现问题,也可以进行改正,可以很大程度的保证你想的那个算法就是对的。

贴一个获得随机数组的方法,这样是在你规定的长度范围内长度随机,在你规定的数值大小范围内,数值大小随机。

再就是用异或运算解题的一些思路

首先异或运算有几个公式:a ^ 0 = a , a ^ a = 0, 异或就是相等为0,不等为1,也可以叫不进位的二进制加法

下面给两道题,1,假设一组数中只有一种数出现奇数次,剩下的数都出现偶数次,找到这个数。这个解法很简单,根据公式我先规定个保存结果的数result = 0 ,result去异或这个数组的每一个数,最后得到result就是这个数。这个代码简单就不写了。

2,假如一组数中只有两种数出现奇数次,剩下的数都出现偶数次,找到这两个数

这道题我思路能看懂能理解,但是我自己确实无法想出来这样去做,下面来说说,首先假设这两个数是a和b,我把所有的数异或一遍,得到的结果就是 a^b,然后我再找到这个结果的其中为1的一位,假设结果是1011000001,很明显可以看出它的第七位是1,是1说明什么,说明a和b在七这位上是不同的,要么a的第七位是1,b的第七位是0,要么反过来,对吧肯定这两数的第七位不一样,所以我就根据第七位的1或者0,把这组数分成两组,一组是第七位是0的,一组是第七位是1的,而且a和b必然是分别在这两组中,这样我把第七位是0的这组数全部异或一遍,得到的就是a或者b,我再去异或前面的结果假设得到的是a,a^(a^b) = b,这样b就得到了。看看代码怎么实现,说实话当时看了这个思路中间的很多细节我想不出用代码怎么实现,只能说niuB!

这上面有一行代码很奇妙,一个数取反加一的和再去异或它本身,就会得到最右边第一位为1的数,这样我再和数组中的每个数做&操作,就会区分出这一位是否相等。。。。

而且用的是位运算,运算效率也是非常高。

分享出来大家一起学习下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值