136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
我的题解(错误错误错误)
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int i = 0;
int n = nums.size();
if (n == 1) {
return nums[0];
}
if (nums[0] != nums[1]) {
return nums[0];
}
if (nums[n - 1] != nums[n - 2]) {
return nums[n - 1];
}
for (int i=1; i < nums.size()-1; i++) {
if (nums[i] != nums[i + 1] && nums[i-1]!=nums[i]) {
return nums[i];
}
}
return 0;
}
};
我的错误
题目要求时间复杂度为线性,且不使用额外空间,而我的题解中虽然没有用额外的空间,但是我使用了sort排序,时间复杂度是n*log2(n)。
正确题解
class Solution {
public:
int singleNumber(vector<int>& nums) {
int value = 0;
for (size_t i = 0; i < nums.size(); ++i) {
value ^= nums[i]; //^是异或运算
}
return value;
}
};
异或的特点:
-
任何数和0做异或,结果任然为原来的数。
-
任何数和本身做异或,结果为0
-
异或满足交换律,结合律
由题目要求可以知道,只有一个数是出现一次的数,其他的数是出现两次。所以根据特点可以得到,我们将所有的数都进行异或操作,最终得到的数一定是那个单独的数。