题目:

Given an array of integers, every element appears twice except for one. Find that single one.

Note: 
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

 

题意:

给定整数数组,除了某个数,其他的数都出现了两次。要求线性时间复杂度O(n),O(n)空间

解题思路:

这道题最困难的是要保证在时间复杂度为线性的条件下,还不能占用额外的空间

代码

方法一:

扫描数组添加到set中,如果出现了2次就从set中erase掉,扫面完后set中唯一一个元素就是我们需要的返回值

class Solution {
public:
    int singleNumber(int A[], int n) {
        set<int> temp;
        set<int>::iterator result;
        for (int i = 0; i < n; ++i)
        {
            result = temp.find(A[i]);
            if (result == temp.end())
            {
                temp.insert(A[i]);
            }
            else
            {
                temp.erase(A[i]);
            }
        }
        return *(temp.begin());
    }
};

方法二:(最佳解法)

本题题的最佳解法是利用异或运算

利用异或的两个特性:相同的数比如a ^ a = 0;并且a ^ b = b ^ a。

只要把所有数都异或起来,最后得到的值就是我们所需要的结果

class Solution {
public:
    int singleNumber(int A[], int n) {
        int res = A[0] ;
        for(int i = 1 ; i < n ; i++)
            res = res ^ A[i];
        return res;
    }
};
收藏 打印