算法题:异或运算


写在前面

今天做了leetcode上一个简单题,看了挺久没做出来。感兴趣的可以先试试题目再往下看。只出现一次的数字

思路

这题拿到手,第一反应是用hash表,没有思考细节,只是觉得hash表肯定是可以搞定的,但是空间复杂度是 O(n),不满足题意。

接着开始思考,如何才能做到空间复杂度是 O(1) 呢?脑袋开始疯狂打转,但没有思路。没办法,退回原点。

心想,如果使用暴力破解法,该如何解决,很简单:每次从数组中取一个数,记为 cur,然后从剩下的数中查找,如果找不到,则 cur 即为要找的那个数。这种解法时间复杂度是 O(n^2)。

继续思考,如何再继续降低复杂度呢? 想到了排序 !!!

再继续思考,如何能把时间复杂度降到 O(n),有两个突破点:

暴力解法做了很多重复的工作

要充分利用题目的已有信息

  • 通过第一点,我没有想到思路,不知道有没有 DP 的解法,可能本人对 DP 使用不是太熟。
  • 通过第二点,我还真找到突破口。反复看了好几篇题目,找到了一个很重要的信息:除了某个元素只出现一次以外,其余每个元素均出现两次。 觉得这是个突破口!!!!——异或运算!

代码

func singleNumber(nums []int) int {
    result:=nums[0]
    n:=len(nums)
    for i:=1;i<n;i++{
        result ^=nums[i]
    }
    return result
}

反思

题目这么明显的提示:其他数字都出现了两次。居然没有想到用异或运算,说明自己对位运算还不太熟悉,需要补一下位运算相关知识,多做一些位运算相关的题目。



文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录