剑指 Offer 56 - I: 数组中数字出现的次数

文章介绍了一种解决编程题目的方法,通过异或操作来找出两个数中不同位的数。由于空间复杂度要求为O(1),不能使用哈希表。作者强调了在处理符号运算时要注意操作符的优先级,并提供了一个策略:通过全局异或找到不同位,然后根据某一位的不同将数字分组进行异或,从而得到结果。这种方法不受相同元素影响,且总的时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

这道题有点想先排序,但是看到空间复杂度只有O(1),所以也不能使用哈希表。但是思路和之前那个找出所有数中唯一的数一样,全局异或开始!

找出两个数中不同位的数!然后以此作为区分!!

千万要记住,&的优先级比==还要低,所以以后在写符号运算类的题目时记得要打上括号或者和等号分开,一旦看到这种错误立马想到优先级问题!

 下面是具体的思路

/*
        思路:这道题,如果看时间复杂度O(n),空间复杂度O(1),其实很好想到异或
             (以前有道题跟这个差不多,只不过有一个不同元素,那个题
        全员异或就出来了,这个不行)
        前置知识:  1^0 = 1     1^1 = 0   0^0 = 0
                  为啥叫异或,就是如果不同我就返回1,相同我就返回0
                  所以如果有两个数相同  010111 ^ 010111 = 0 异或就为0
        例子: 1 4 6 4 如果全员异或,相同的4肯定没了,留下1 和 6异或的结果,
        但是光异或我没法返回啊
              哪我就想到了一个很赞的做法
              1 和 6 肯定是不同的吧,异或结果有一位肯定是 1,比如说第2位异或为1
                          => 也就是说 1 和 6 ,第二位一个为1一个为0
              那么我就分组,将第二位为1的分一组,全员异或
                          将第二位为0的分一组,全员异或
              这就是最终结果了
              你可能还有疑问,哪相同的元素怎么办,不会干扰结果吗?
                 当然不会,比如4 和 4,第二位都为0,肯定都被
            分到一组,最后异或为0,不影响结果
        总结:时间复杂度O(n) 更细就是O(2n)   时间复杂度O(1)
     */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值