LeetCode136. 只出现一次的数字

题目

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

说明:

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

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

分析

可以用哈希表,来统计每个数字出现的频率然后输入频率为1的数字。

但是题目要求线性时间复杂度,而且不适用额外空间,使用哈希表就不符合这个条件。

这个题可以用异或运算,对于异或一直都是只知道它存在,但从没用过,了解也不多。

 异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”,在java里用  ^ 来表示。

运算法则:

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

 也就是当a b 两个值相同时,返回0;a b两个值不相等是,返回1。相同为真,不相同为假。

0 ^ 0 = 0    0 ^ 1 = 1    1 ^ 0 = 1   1 ^ 1 = 0 同0异1

0  ^  a   =   a

代码

class Solution {
    public int singleNumber(int[] nums) {
        int result = nums[0];
        for (int i = 1; i < nums.length; i++) result ^= nums[i];
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38595487/article/details/81142369