LeetCode 136. Single Number
最原始的方法:先排序,然后从头查找。若nums[i] = nums[i] + 1则为一对相同的数,i = i + 2,继续判断。若nums[i] != nums[i] + 1,则输出nums[i]。需注意不要越界!
class Solution { public: int singleNumber(vector<int>& nums) { int t; if(nums.size() == 1) { t = nums[0]; } else { 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]; } } } return nums[nums.size()-1]; } };
通过参考别人的解题报告发现,可以使用异或运算:对所有元素做异或运算,其结果为那个出现一次的元素,理解是a1 ^ a2 ^ ....,可以将所有相同元素交换至相邻位置,首先运算相同元素,则会产生(n - 1)/2个0异或积,剩余一个单一元素,他们的异或积为这个单一元素自己,得解。参考原帖:http://www.cnblogs.com/changchengxiao/p/3413294.html
由此有以下代码:
class Solution { public: int singleNumber(vector<int>& nums) { int result = 0; for (int i = 0; i < nums.size(); i++) { result ^=nums[i]; } return result; } };