LeetCode 136. Single Number

最原始的方法:先排序,然后从头查找。若nums[i] = nums[i] + 1则为一对相同的数,i = i  + 2,继续判断。若nums[i] != nums[i] + 1,则输出nums[i]。需注意不要越界!

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int t;
        if(nums.size() == 1)
        {
            t = nums[0];
        }
        else
        {
            sort(nums.begin(), nums.end());
            for(int i = 0; i < nums.size() - 1; i++)
            {
                if(nums[i] == nums[i+1])
                {
                    i++;
                }
                else
                {
                    return nums[i];
                }
            }
        }

        return nums[nums.size()-1];
    }
};

 

通过参考别人的解题报告发现,可以使用异或运算:对所有元素做异或运算,其结果为那个出现一次的元素,理解是a1 ^ a2 ^ ....,可以将所有相同元素交换至相邻位置,首先运算相同元素,则会产生(n - 1)/2个0异或积,剩余一个单一元素,他们的异或积为这个单一元素自己,得解。参考原帖:http://www.cnblogs.com/changchengxiao/p/3413294.html

由此有以下代码:

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

 

posted @ 2016-11-02 08:08  yrwang  阅读(100)  评论(0编辑  收藏  举报