[LeetCode]136 单一的数字

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值