Given a non-empty 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?
Example 1:
Input: [2,2,1] Output: 1
分析:
输出只出现一次的数字。可以先对数组元素从大到小进行排序,依次考虑出现一次的数字在开头、中间以及末尾的情况。
解法1:
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin() , nums.end());
for(int i=1; i<nums.size()-1; i++)
{
if((nums[i] != nums[i+1]) && (nums[i] != nums[i-1]))
return nums[i];
else if(nums[0] != nums[1])
return nums[0];
else if(nums[nums.size()-1] != nums[nums.size()-2])
return nums[nums.size()-1];
}
return nums[0];
}
};
当然,可以直接用按位异或来做,初始数字为0,依次对数组元素进行按位异或,若出现相同的数字,按位异或会为0,所以最后留下的数字即为只出现一次的数字。
解法2:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int num = 0;
for (int i = 0; i < nums.size(); ++i) {
num ^= nums[i];
}
return num;
}
};