只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这题是简单难度。
第一个想到的是遍历两遍。这个方法不仅操作起来有些复杂,而且可能会超过时间限制。
第二个想到的是将所有不同的字符重复两遍在减去s,得到唯一的一个字符就是答案。例如{a,a,b,b,c,c}-{a,a,b,b,c}=c,那么最后答案就是c。但是这个方法需要另外的一个大空间来储存数组,所以也不是很好。

因为老师提示过可以用位运算,所以就有了第三个方法
第三个方法就是我介绍的方法:异或
异或在c#里的符号是 ^ 。异或它应用于逻辑运算,
a^b = (¬a ∧ b) ∨ (a ∧¬b)。
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。这是逻辑上的运算,对于计算机上,异或的运算法则相当于不带进位的二进制加法。相同的数字异或后为0(因为1 ^ 1=0;0 ^ 0=0)
最重要的是,它满足交换律结合律
例如:
a ^ b ^ a=a ^ a ^ b=b; a ^ c ^ b ^ b ^ a= a ^ a ^ b ^ b ^ c=c;

所以我们找到唯一值只需要把所有的数字异或,得到的最后的数字就是答案。
代码:

public class Solution {
    public int SingleNumber(int[] nums) {
        for(int i=1;i<nums.Length;i++)
        {
            nums[0]=nums[0]^nums[i];
        }
        return nums[0];
    }
}

没有用到额外的空间。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值