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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值