[LeetCode]55. Single Number独数

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?

Subscribe to see which companies asked this question

 
这题一个问题是题目没有限定输入数组的情况,同时也没有规定在输入数组不满足要求的情况下的输出。因此在考虑输入数组不满足“every element appears twice except for one”的情况下输出定义为什么值不清楚。
解法1:数组排序,再比较相邻数是否相等即可。时间复杂度O(nlogn),空间复杂度O(n)。(快排)
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        for(int i = 1; i < nums.size() - 1; ++i)
            if(nums[i - 1] != nums[i] && nums[i] != nums[i + 1]) return nums[i];
        return nums.size() == 0 ? 0 : nums[0]; //任意输出0或者第一个值
    }
};

 

解法2:扫描一遍数组,将其映射到Map中;再扫描一遍Map,找到其中出现了两次的数。时间复杂度和空间复杂度都是O(n)。
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int, int> m;
        for(int i = 0; i < nums.size(); ++i)
            ++m[nums[i]];
        for(map<int, int>::iterator iter = m.begin(); iter != m.end(); ++iter)
        {
            if(iter->second == 1) return iter->first;
        }
        return nums.size() == 0 ? 0 : nums[0]; //任意输出0或者第一个值
    }
};

 

解法3:考虑题目要求的O(n)时间复杂度和O(1)空间复杂度,则不能使用常规排序法或者Map。题目的Hide Tags提示使用位操作。注意到两个相同的数异或后结果是0,因此如果数组中只有一个数只出现一次,而其他所有数都出现两次的话,整个数组的所有数异或之后得到的结果必定是那个单独的数。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res = 0;
        for(int i = 0; i < nums.size(); ++i)
            res ^= nums[i];
        return res;
    }
};

 

posted @ 2015-11-03 10:59  AprilCheny  阅读(252)  评论(0编辑  收藏  举报