大家好,继续刷题日记数组部分,题目如下:
我的思路是这样的:
先做一个排序,然后逐个比较,如果相同就跳两个,直到找到跟下一个不同的为止。代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int len = nums.size();
int i = 0;
while(i < len){
if(nums[i] == nums[i + 1])
i += 2;
else return nums[i];
}
}
};
但是这种方法还是有点简单粗暴,讨论区有一位大佬写的代码我觉得很简单,放上来参考一下:
int singleNumber(int A[], int n) {
int result = 0;
for (int i = 0; i<n; i++)
{
result ^=A[i];
}
return result;
}
其中^表示异或运算,异或运算表示如果两个相同的数取异或则等于零,如果是两个不同的数则按二进制表示按位取异或,如果不同则为1,相同则为0。还有一点需要注意,异或为线性运算,是可以调换顺序的,例如4^1^2^1^2可以调换为4^1^1^2^2,其中1^1 = 0,2^2 = 0,0^0 = 0,任何数与0异或都为它本身,大家可以转换为二进制试一下,因此这样就可以得到落单的数了,非常巧妙。
学到了一种新的方法,记录一下,我们下期见!