Leetcode刷题24-136.只出现一次的数字(C++)

题目来源:链接: [https://leetcode-cn.com/problems/single-number/].

1.问题描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例1:

输入: [2,2,1]
输出: 1

注意:

输入: [4,1,2,1,2]
输出: 4

2.我的解决方案

我的思路比较暴力,也比较蠢,哈哈哈。
先由小到大排序sort,然后找出 与 前后的元素 都不一样的 元素。
注意len = 1 的情况。
注意首尾的情况。

代码如下:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int len = nums.size();
        int i = 0;
        if(len == 1)                     //处理异常1:nums中元素只有一个的情况
        {
            return nums[0];
        }
        if(nums[0] != nums[1])          //处理异常2:处理排序后 第一个元素就是不重复的情况
        {
            return nums[0];
        }
        if(nums[len-1] != nums[len-2])  //处理异常3:处理排序后 最后一个元素就是不重复的情况
        {
            return nums[len-1];
        }
        for(i = 1; i < len - 2; ++i)    // 查找 不重复的
        {
            if( (nums[i] != nums[i-1]) && (nums[i] != nums[i+1]) )
            {
                break;
            }
        }
        return nums[i];
    }
};
//加速的  装X专用啊哈
static auto _____ = []() 
{
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}();

3.大神们的解决方案

看看人家的代码,厉不厉害?羡不羡慕?知道自己和人家的差距了吧?勉励自己继续加油!!!

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res = 0;
        for (auto num : nums)
        {
             res ^= num;       
        }
        return res;
    }
};

大神为会这么写呢???
请继续往下看。。。就会懂的。哈哈

4.我的收获

大神的代码主要是用的位操作,简洁明了!
又学到了新的 知识,开心!

1. 交换律:a ^ b ^ c <=> a ^ c ^ b
2. 任何数与0异或 :0 ^ n => n
3. 相同的数异或为 0: n ^ n => 0

举例: a = [2,3,2,4,4]
2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3

2019/3/15 胡云层 于南京 24

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/88582827