LeetCode 热题 HOT 100 第48天:“只出现一次的数字”

继续刷LeetCode 热题 HOT 100 的题目,并且在博客更新我的solutions。在csdn博客中我会尽量用文字解释清楚,相关Java代码大家可以前往我的个人博客jinhuaiyu.com中查看。
题目:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4

solution:异或
要求线性时间复杂度,但不用额外空间,我们只能排除所有用空间换时间的方法,比如hash,当然也不能排序,因为排序算法最快也是O(nlogn)。这道题只能从找规律找性质的角度入手,比如我们可以看到其余元素均出现两次。如果有什么办法能在一轮遍历时让两个一样的数抵消的话,最后就只会留下要求的那个数了。
两个一样的数抵消(变成某种运算的无影响数),比如变成加法计算的0,乘法计算的1,而且这种运算必须要有交换律和结合律,这样才能在一轮遍历后,两两抵消,剩下要求的数字。这种运算就是异或,二进制的异或性质如下:
0^0=0,0^1=1,1^0=1,1^1=0。
总结就是同假(0)异真(1),而且0和任何数异或等于任何数,可以看到异或运算中,相同的数异或后抵消成为0,而0和任何数异或等于任何数。最关键的是异或是满足结合律和交换律的。
所以我们可以用位运算——异或来解决这道题。假设经过交换后数组元素为{2,2,1},2^2=0,而0^1=1,我们就可以在一轮遍历后得到最终结果了。
另外,不同位数的二进制(十进制数转成的二进制)进行位运算,会在前面补0,但0和任何数异或等于任何数,所以补0是不影响结果的。

Finally,带有详细注释的代码放在我的个人博客http://jinhuaiyu.com/leetcode-single-number/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值