题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 链接:https://leetcode-cn.com/problems/single-number
解法1:非线性时间
先把数组排序,然后依次遍历,找出唯一一个数字
解法2:线性时间,空间复杂度高
用hashmap去存储这些数字作为key,出现次数作为value,找出value=1的那个key
class Solution { public: int singleNumber(vector<int>& nums) { map<int,int> ret; for(auto i:nums) ret[i]++; for(auto i=ret.begin();i!=ret.end();i++) { if(i->second!=2) return i->first; } return 0; } };
解法3:线性时间,空间复杂度O(1)
用异或运算,原理是0与任何数n异或后都是n,两个相同的数异或后结果都是0,即:
0^n=n,n^n=0
此解法性能最优,代码如下:
class Solution { public: int singleNumber(vector<int>& nums) { int ret=0; for(int i=0;i<nums.size();i++) ret=ret^nums[i]; return ret; } };