LeetCode刷题——只出现一次的数字

大家好,继续刷题日记数组部分,题目如下:


我的思路是这样的:

先做一个排序,然后逐个比较,如果相同就跳两个,直到找到跟下一个不同的为止。代码如下:

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异或都为它本身,大家可以转换为二进制试一下,因此这样就可以得到落单的数了,非常巧妙。

学到了一种新的方法,记录一下,我们下期见!


猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80236861