一个寻常的思路是建立一个二位数组rec,val分量用于储存出现的数字的值,cnt分量用于储存他出现的次数,然后遍历一遍数组,对于数组中的每个元素,如果rec中有这个数,就把cnt++,没有就创建一个,把cnt置为1;最后遍历一遍数组rec,返回cnt值为1的val。该算法代码量较大,空间复杂度为O(n),时间复杂度为O(n^2),emmmm,垃圾算法
冥思苦想了好半天我终于想到了神奇的位操作----异或(exclusive or),该操作具有以下性质(以C语言中的异或运算符代表异或符号)
- 0^0=0
- 0^1=1
- 1^0=1
- 1^1=0
总结起来就是
- 0^a=a
- a^a=0
异或具有交换律和结合律
将我们要返回的值ans初始为0,然后遍历数组,相同的数异或后得0,0与要求的数结合得它本身,所以最后ans的值就是只出现了一次的数,代码如下
int singleNumber(vector<int>& nums) {
int len=nums.size(),ans=0;
for(int i=0;i<len;i++) ans^=nums[i];
return ans;
}