题意
已知数组a中有且仅有一个数字出现次数为奇数,请你把这个数字找出来。
解法1
我们可以很方便地用语言中自带的字典结构(如C++中的unordered_map, Java中的HashMap和Python中的字典)统计每个数的出现次数。
时间复杂度:
空间复杂度:
class Solution { public: /** * * @param a int整型vector 保证长度为奇数且符合题意 * @return int整型 */ int theNumberAppearOddTimes(vector<int>& a) { unordered_map<int> dict; int ans; for(int i=0;i<a.size();i++) if((++dict[a[i]])&1) ans=a[i]; return ans; } };
解法2
本题还有一个更巧妙的解法,就是利用异或运算的性质。、
我们知道对于一个数
,有
又因为异或运算满足
交换律和结合律,所以我们将数组a中的所有元素异或起来就得到了结果。
时间复杂度:
空间复杂度:
class Solution { public: /** * * @param a int整型vector 保证长度为奇数且符合题意 * @return int整型 */ int theNumberAppearOddTimes(vector<int>& a) { int ans=0; for(int i=0;i<a.size();i++) ans^=a[i]; return ans; } };