[LeetCode]136 单一的数字

来源:互联网 发布:rsa加密算法 c语言 编辑:程序博客网 时间:2024/05/18 00:23

Single Number(单一的数字)

【难度:Medium】
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),能否不使用额外空间来完成?


解题思路

根据题意很容易想到的一个方法就是统计每个数字出现的次数,然后在统计的结果中找到次数为1的数字。但是这种方法在样例很大时会超时。
然后我们知道异或(XOR)基本运算性质:
a^a = 0,a^0 = a, a^b^a = a^a^b = 0^b = b
那么解法显而易见了:一趟遍历,将所有数字进行异或,最后结果就是单一的数字。


C++代码如下:

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

还有一种解法是使用数据结构set,由于set自带去重功能,那么在nums[i]时,若在set中不存在,则insert;若已存在,则remove。最后set中只剩下单一的数字。该方法耗时较高因为涉及到了查找方面。


C++代码如下:

class Solution {public:    int singleNumber(vector<int>& nums) {        set<int> ans;        for(int i = 0;i < nums.size();++i){            if(ans.find(nums[i]) == ans.end()) ans.insert(nums[i]);            else ans.erase(nums[i]);        }        auto it = ans.begin();        return *it;    }};
0 0
原创粉丝点击