码迷,mamicode.com
首页 > 其他好文 > 详细

异或巧用:Single Number

时间:2015-07-01 12:14:53      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

异或巧用:Single Number

今天刷leetcode,碰到了到题Single Number,觉得解答很巧妙,故记之。。。

题目:

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

翻译:给定一个整形数组,其中除了一个元素出现一次外,其他元素均出现两次。找到那个出现一次的元素

注意:算法应具有线性时间复杂度。你能不用额外内存实现它么?

思路:通过异或运算实现。

原理:异或运算中,两个二进制位相同取零,不同则取1.

异或特性:

(1)顺序无关:即若有多个元素相异或,则异或元素可以随意交换顺序,不会影响结果

(2)对相同的数异或两次等于没有异或:即相当于+x-x

故,根据异或特性,从逻辑上可以认为是数组中相同元素先各自异或,结果为0,而最终剩下的那个元素即为出现一次的元素。Java代码如下:



另附一道同样应用异或运算解决的题目(面试时可能会遇到):

给定1-1000个连续自然数,然后从中随意去掉两个,再打乱顺序。要求只遍历一次,求出被去掉的两个数(设为xy)。

步骤:

(1)计算x^y:现将打乱前和打乱后的两个数组(记:数组1和数组2)的所有元素做异或运算,重复的元素会互相抵消,所得最终结果即为x^y

(2)获取x^y1所在位置并划分,继续异或:由于xy是不同的整数,所以这两个数的异或结果,转化为二进制的话,至少有一位是1,假设在第3位。把数组1按第3位是否为0进行划分,划分为两个数组,每个数组各包含一个被抽取的数。把数组2也按这个规则划分为两个数组,这样就得到了4个数组,其中两组是第3位为0,另外两组是第3位为1。把第3位为0的两个数组进行异或就能得到被抽取的一个事。同理把第3位为1的两个数组异或就能得到另外一个被抽取的数

版权声明:本文为博主原创文章,未经博主允许不得转载。

异或巧用:Single Number

标签:

原文地址:http://blog.csdn.net/yangyao_iphone/article/details/46708029

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!