怒刷力扣(出现一次的数字)

简介: 这个题不熟悉异或的同学可能找不到这个解题的方法。做了这么久的算法,发现很多算法题都能用到数学的方法进行计算,这样说可能不合适,算法本身就是数学的一种解题方法。还是感觉自身掌握的太少了。

只出现一次的数字

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

初次分析

使用HashMap记录每个出现的值为key,value自然是次数。但是题目要求不能使用额外的空间,也就是说初步的想法使用HashMap是不可行的,既然不能使用额外的空间,那么就得另寻他法了。

继续分析

使用异或。那么何为异或?异或也就是半加算法,顾名思义就是不带进位的二进制算法。异或有以下三个特点。

  • 与0异或,值不变
  • 与自身异或,值为0
  • 满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

我们说的异或都是基于二进制的,那么我们这个题运算的时候,他怎么计算的呢?例如[1,2,1,2,4]

  • 第一轮0⊕1=1。
  • 第二轮1⊕2=3。这个怎么计算的呢?

    1的二进制01,而2的二进制是10,那么01和10做异或操作,即image.png
    值为11即为3。

  • 第三轮3⊕1=2

image.png

  • 第四轮2⊕2=0
  • 第四轮0⊕4=4

答案

public static int singleNumber(int[] nums) {
        int result = 0;
        for (int num : nums) {
            result ^= num;
        }
        return result;
    }

复杂度

  • 时间复杂度: O(n),只需要遍历一次数组即可实现。
  • 空间复杂度: O(1),只需要常数变量来记录异或运算的结果。

总结

使用了异或,当第一次遇到一个数字时,相当于加操作,遇到第二次时相当于一个减操作,最后的结果就是我们的答案。

这个题不熟悉异或的同学可能找不到这个解题的方法。做了这么久的算法,发现很多算法题都能用到数学的方法进行计算,这样说可能不合适,算法本身就是数学的一种解题方法。还是感觉自身掌握的太少了。这个题最先想到的就是有Hash来解决,看了答案才知道异或。继续加油吧。

都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

目录
相关文章
|
存储 算法 索引
怒刷力扣(环形链表)
没想到曾经的寓言故事龟兔赛跑,还能应用在解循环的算法之中,今天是涨了见识了。
248 3
怒刷力扣(环形链表)
|
算法
怒刷力扣( 二叉树的最小深度)
这个题的坑就是没有左右子树的时候,这个节点才是叶子节点,这时候计算的结果才是根节点到叶子节点的深度。
187 4
怒刷力扣( 二叉树的最小深度)
|
程序员
怒刷力扣( 路径总和)
粗心大意往往是BUG诞生的条件,那么细心必是解决BUG的良药,做个细心的不写BUG的程序员,从避免粗心大意开始。
987 2
怒刷力扣( 路径总和)
|
算法
怒刷力扣( 相同的树)
解决这个问题题有两种,第一种思路深度遍历更加直观明了,不会第二种的就学会第一种。能都掌握自然是更好。
79 1
怒刷力扣( 相同的树)
|
算法
怒刷力扣(二叉树的中序遍历)
二叉树的中序遍历,前两种算法相对来说,比较容易理解,但是第三种,就需要自己思考思考了,想明白了其实也并不是很难。
123 1
怒刷力扣(二叉树的中序遍历)
怒刷力扣(删除排序链表中的重复元素)
单链表是我们在数据结构中非常常见的链表,那么最简单的删除链表元素你会吗?什么so easy?那下一篇?
149 1
怒刷力扣(删除排序链表中的重复元素)
|
存储
怒刷力扣(加一)
数字加一如果放到数组中会发生哪些奇奇怪怪得事情呢?那么接下来就一起看看数字放在数组中加一,怎么计算吧。
98 1
怒刷力扣(加一)
|
存储 算法
怒刷力扣(最大子数组和)
动态规划法试图仅仅解决每个子问题一次,从而减少计算量,一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。
116 1
怒刷力扣(最大子数组和)
|
算法
怒刷力扣(买卖股票的最佳时机)
这个题本质就是分两步,第一步就是找到最低价即买入时机。找到买入时机之后则是对比利润找到卖出时机。解决这两步,答案就出来了。
111 1
|
算法
怒刷力扣(验证回文串)
双指针算法,不是第一次用了,这个题使用双指针算法能提高近一半的效率,看见字符串就习惯性的对字符串进行处理。
106 0
怒刷力扣(验证回文串)