Day5.只出现一次的数字--LeeCode练习

题目再现

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现过两次,找出那个只出现过一次的元素。
说明
你的算法应该具有线性时间复杂度。你可以不使用额外的空间来实现么?

示例一
输入: [2,2,1]
输出: 1

代码1(我的代码)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int p=nums.size();
        sort(nums.begin(),nums.end());

        if(nums.size()==1)
            return nums[0];

        for(int i=0;i<nums.size();i++){
            if(i==0){
                if(nums[i]!=nums[i+1]) return nums[i];
            }
            else if(i==nums.size()-1){
                if(nums[i]!=nums[i-1]) return nums[i];
            }
            else{
                if(nums[i]!=nums[i-1] && nums[i]!=nums[i+1])
                    return nums[i];
            }
        }
        return 0;
    }
};

我的代码运行速率:在这里插入图片描述代码思想:
首先将数据进行排序,这样相同的数据就会挨在一起,只要当前数据i与前面和后面的都不同,那么这个数据就是独立的。第一个和最后一个数据只需要与后面的或者前面的数据进行比较。

代码2

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int p=0;
        for(auto x:nums) p^=x;//用了异或
        return p;
    }
};

代码思想来自于LeeCode
这里使用了异或思想:
当两个相同的数据出现时,值为0:a​⊕a=0
而:a1​⊕a2​⊕a1=(a1​⊕a1)​⊕a2=a2
所以式子可以整理为:
(a1​⊕a1​)⊕(a2​⊕a2​)⊕⋯⊕(am​⊕am​)⊕am+1​=am+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值