您的位置:首页 > 编程语言 > C语言/C++

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

2019-03-15 20:12 204 查看

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

136.只出现一次的数字

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: