首页
学习
活动
专区
圈层
工具
发布

【Leetcode】136.只出现一次的数字

题目

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

说明:

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

示例 1:

代码语言:javascript
复制
输入: [2,2,1]
输出: 1

示例 2:

代码语言:javascript
复制
输入: [4,1,2,1,2]
输出: 4

题解

这道题要求时间复杂度是o(n),空间复杂度是o(1)。难点在于空间复杂度,所以最开始我们很容易想到的hash的方式肯定是不行的。那就要找数组本身有没有什么性质了,本题考查的是异或运算。

先复习一下异或运算,同为0,异为1:

0 ^ 0=0,1 ^ 0=1,0 ^ 1=1,1 ^ 1=0。

同时异或具有如下性质:

  • A ^ B = B ^ A。异或满足交换律。
  • A ^ 0= A。任何数与0的异或不改变本身的值。

假设题目中描述的数组为 [A1,A1,A2,A2,…,An,An,Ax]。其中,Ax 只出现一次,其余的元素都出现两次。对该数组中的所有元素进行异或运算可得:

[A1,A1,A2,A2,…,An,An,Ax] 的乱序序列异或

= A1 ^ A1 ^ A2 ^ A2… ^ An ^ An ^ Ax

= (A1 ^ A1) ^ (A2 ^ A2)… ^ (An ^ An) ^ Ax

= 0 ^ 0… ^ Ax

= Ax

因此,只需要遍历数组中的所有元素,依次进行两两异或操作就可以找出只出现一次的元素。

代码语言:javascript
复制
class Solution {
    public int singleNumber(int[] nums) {
        int ret = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            ret ^= nums[i];
        }
        return ret;
    }
}

热门阅读

下一篇
举报
领券