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?
题意是给出一个数组,其中只有一个数是只出现一次,其他都是出现2次,然后要找出这个出现一次的数。所以最简单的做法是和后一个数比较,相等的话,i+2,不等的话直接输出。要注意的是,循环的结束条件不能越界,处理越界后还得对最后一个数进行处理。
Code:(LeetCode运行16ms)
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i++) {
if (nums[i] == nums[i + 1]) {
i++;
} else {
return nums[i];
break;
}
}
return nums[nums.size() - 1];
}
};
还有一种做法是进行异或操作,因为两个相同的数异或之后等于0。所以假设序列是a0,a0,a1,a2,a2,设结果初始值为0,然后0^a0=a0, a0^a0=0. 0^a1=a1, a1^a2^a2 = a1.....这样一直下去最后结果就是a1.
Code:(LeetCode运行13ms)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result = 0;
for (auto i : nums) {
result ^= i;
}
return result;
}
};