算法篇:位运算异或的使用(一)

算法:

在位运算中,运用最多的便是异或操作^,规则如下所示:

1.a^a = 0 ,a^0 = a,
2.a^b^a= a^a^b = 0^b = b
备注:下面的两个题目是单纯使用异或操作的题目,一种是最基本的异或操作,
一种是稍作转换就可以完成的变形题目。

题目1: 异或的基本使用

https://leetcode-cn.com/problems/single-number/

代码实现:

func singleNumber(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    res := 0
    for _,v := range nums{
        res ^= v
    }
    return res
}
// 算法:
// 利用位运算,异或的使用,a^a = 0 ,a^0 = a,
// 因为题目是两个数,和一个数,属于^的完美使用范畴,
// 由公式:a^b^a= a^a^b = 0^b = b,可以直接将代码取异或操作,
//结果就是那个个数为1的数

执行结果:

题目2: 异或的变形题目

https://leetcode-cn.com/problems/single-number-iii/

代码实现:

func singleNumber(nums []int) []int {
    if len(nums) == 0 {
        return nil
    }
    // step1:抵消掉数量为2的数
    tmp:= 0
    for _,v:=range nums{
        tmp ^= v
    }
    // step2:找出来第一个为1的bit位
    i:=0
    for {
       n := 1<<i 
       if tmp&n != 0 {
           break
       }
       i++
    }
    // step3:按照bit=1来将数组分成两组,然后分别计算这两组的异或值,也就是这两个数
    a,b := 0,0
    test := 1<<i
    for _,n := range nums {
        if n & test == 0{
            a^=n
        } else {
            b^=n
        }
    }
    return []int{a,b}
}
// 算法:属于异或的延伸题目
// 因为有两个数字个数是1,其他都是两个,所以要使用异或,
// 大体思路是将包含两个一个的数组变成2个分别包含一个个数是1的数组里面,将题目转换成题目1的做法
// 算法分为三步: 
// step1:通过异或,最终获取这两个数字的异或结果a^b=0xiiiii, 
// 这里只要是bit!=0,就说明这一个bit位在a,b两个数中不相同,我们就从低位开始找,找到第一个为1的bit位即可。
// step2:找到这个bit位置
// step3:遍历数组,将数组中该bit==1的元素放入数组A,bit==0的放入数组B,
// 分别计算A,B就可以得到这两个数。

执行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值