【LeetCode 136】只出现一次的数字

从大三开始,给自己立下了刷LeetCode的flag。一方面是巩固已经快要淡忘的算法与数据结构知识,另一方面也是为保研的机试作准备。我的第一篇CSDN博客就献给这道题。

 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

看完这道题,我的脑海中立马浮现出了两种方法,一种是对数组先排序再找数,另一种是使用map记录各数出现的频数。然而前者不是线性时间复杂度,后者需要使用额外空间。冥想良久,无果,遂百度求解。知道真相的我禁不住老泪纵横……废话不多说,直接show the code!

        int xor = 0;
        for (int i = 0; i < nums.length; i++ ) {
            xor ^= nums[i];
        }
        return xor;

这也太666了,就运用了异或的两个性质:

  1. A xor A = 0

  2. A xor 0 = A

只要对数组的元素挨个异或,再运用一下交换律,成双成对的都被干成0,而最后落单的那位与0异或还是他自身,就这么得出了结果……我只想说,如果我现在就匆忙献上了膝盖,那我以后可能连四肢都不保了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值