zoukankan      html  css  js  c++  java
  • 【LeetCode】-- 260. Single Number III

    问题描述:

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

      在一个数组里面,只有两个元素仅出现过1次,其余都出现过两次。找出出现仅一次的那两个(a, b)。

    要求常量空间,线性时间。

    问题解决:

      这题用到“神奇的位运算”。

      1.因为除了特殊的两个元素,其余两两出现,那么就想到了XOR(异或)。

      2.从头到尾XOR之后,会得到a xor b 的结果。接下来我们试着把这两个元素分离开来。

      3.我们在a xor b 中找到任意一位XOR[diff_pos] = 1 , 那么可知在diff_pos这位上a 和 b 是不一样的。如果按照diff_pos这位的值

      分类可以将所有数分成两组: 1)diff_pos = 0的元素, 2)diff_pos = 1的元素。

      4.对3中的两组分别组内xor,因为其余元素都是 两两出现,那么最后就剩下a / b 了。

    代码如下:

    class Solution(object):
        def singleNumber(self, nums):
            xor = 0
            for num in nums:
                xor = xor^num
            diff_pos = 0
            for i in range(31):
                if(xor & (1 << i)):
                    diff_pos = i
                    break
            rec = [0,0]
            for num in nums:
                if(num & (1 << diff_pos)):
                    rec[1] ^= num
                else:
                    rec[0] ^= num
            return rec

      论文还没看,又在瞎搞了。。。

    找最右边的1比特位确实有更好的方法:

    xor = xor & ~(xor - 1);
  • 相关阅读:
    机械学习--5
    机械学习--4
    机械学习--3
    机械学习--2
    机器学习--1
    编译原理 作业十五
    编译原理 作业十四
    编译原理 作业十二
    编译原理 作业十一
    编译原理 作业十
  • 原文地址:https://www.cnblogs.com/luntai/p/5573932.html
Copyright © 2011-2022 走看看