Problem:
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?
Solution 1:
class Solution {
public:
int singleNumber(vector<int>& nums) {
//if (nums.size() == 1) return nums[0];
sort(nums.begin(), nums.end()); // 排序
/* 若前两个元素不相同,直接返回首元素; 若最后两个元素不相同,直接返回末元素*/
if (nums[0] != nums[1]) return nums[0];
if (nums[nums.size()-1] != nums[nums.size()-2]) return nums[nums.size()-1];
for (int i = 1; i < nums.size()-1; i++) {
// 每个元素与其前后元素对比,均不相同则为所求
if (nums[i]-nums[i-1] != 0 && nums[i+1]-nums[i] != 0)
return nums[i];
}
}
};
Solution 2:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
/*
** 利用xor(异或运算)的特性:
** 1. 0与n(非0整数)异或结果必为n
** 2. n与其本身异或结果必为0
*/
for (auto i : nums) {
res ^= i;
}
return res;
}
};
该解法参考自:https://discuss.leetcode.com/topic/9002/4-lines-of-c-solution