美文网首页
只出现一次的数字

只出现一次的数字

作者: 风中丶凌乱 | 来源:发表于2019-05-18 23:39 被阅读0次

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

说明:

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

示例 1:

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

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

解答:
自己写的代码,思路很简单,创建一个字典,循环遍历整个数组,如果该值在字典中出现证明该值出现不止一次,从字典中删除该元素,否则把该值存储在字典中。

 s = {}
        for i in nums:
            if i in s.keys():
                s.pop(i)
            else:
                s[i]=1
        return list(s.keys())[0]

看了大神的解答之后,感觉自己写的方法是多么的low,用异或法简直不要太舒服。
先说一下与、或、异或运算。

1. 与运算(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。

例如:9&5 即 0000 1001 (9的二进制补码)&00000101 (5的二进制补码) =00000001 (1的二进制补码)可见9&5=1。

2. 或运算(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

即 :参加运算的两个对象只要有一个为1,其值为1。

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。

例如:9|5可写算式如下: 00001001|00000101 =00001101 (十进制为13)可见9|5=13

3. 异或运算(^)

参加运算的两个数据,按二进制位进行“异或”运算。

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

例如:9^5可写成算式如下: 00001001^00000101=00001100 (十进制为12)可见9^5=12

所以很容易就能想到用异或运算所有相同元素都会互相抵消,剩下一个“单身狗”元素了。
大神代码:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        result = nums[0]
        for i in range(1,len(nums)):
            result ^= nums[i]
        return result

差距啊 ,继续努力!!!

相关文章

网友评论

      本文标题:只出现一次的数字

      本文链接:https://www.haomeiwen.com/subject/jrnxzqtx.html