题目来源:链接: [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