异或巧用: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代码例如以下:

</pre><pre class="java" name="code">public class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i:nums) {
res ^= i;
}
return res;
}
}

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

给定1-1000个连续自然数,然后从中任意去掉两个,再打乱顺序。

要求仅仅遍历一次,求出被去掉的两个数(设为x和y)。

步骤:

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

(2)获取x^y中1所在位置并划分。继续异或:因为x和y是不同的整数,所以这两个数的异或结果。转化为二进制的话,至少有一位是1,如果在第3位。

把数组1按第3位是否为0进行划分,划分为两个数组。每一个数组各包括一个被抽取的数。

把数组2也按这个规则划分为两个数组。这样就得到了4个数组。当中两组是第3位为0,另外两组是第3位为1。

把第3位为0的两个数组进行异或就能得到被抽取的一个事。同理把第3位为1的两个数组异或就能得到另外一个被抽取的数

异或巧用:Single Number的更多相关文章

  1. Single Number 普通解及最小空间解(理解异或)

    原题目 Given a non-empty array of integers, every element appears twice except for one. Find that singl ...

  2. [LeetCode] Single Number III 单独的数字之三

    Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...

  3. [LeetCode] Single Number 单独的数字

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

  4. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  5. LeetCode——Single Number II(找出数组中只出现一次的数2)

    问题: Given an array of integers, every element appears three times except for one. Find that single o ...

  6. 【LeetCode】Single Number I & II & III

    Single Number I : Given an array of integers, every element appears twice except for one. Find that ...

  7. LeetCode 【Single Number I II III】

    Given an array of integers, every element appears twice except for one. Find that single one. 思路: 最经 ...

  8. Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference

    最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...

  9. Single Number II

    题目: Given an array of integers, every element appears three times except for one. Find that single o ...

随机推荐

  1. jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space

    使用myeclipse启动两个SSH2的部署在tomcat6下的项目 报出java.lang.OutOfMemoryError: PermGen space 解决办法: 在myeclipse中加大jv ...

  2. RTSP详解

    关于 RTSP. RTSP协议是一个非常类似HTTP协议的流控制协议.它们都使用纯文本来发送信息,而且rtsp协议的语法也和HTTP类似.Rtsp一开始这样设计,也是为了能够兼容使用以前写的HTTP协 ...

  3. NodeJs运行服务器-day01

    //读取内置模块http,这个模块开发服务器用的var http =require('http'); var server=http.createServer(function(req,res){ r ...

  4. 28. TRIGGERS ,29. USER_PRIVILEGES,30. VIEWS

    28. TRIGGERS TRIGGERS表提供有关触发器的信息.要查看有关表的触发器的信息,您必须具有该表的TRIGGER权限. TRIGGERS表有以下列: TRIGGER_CATALOG :触发 ...

  5. Oracle 11G RAC 修改IP

    实验环境 类别 修改前 修改后 PUBLIC 172.18.4.182 rac1 192.168.56.10 rac1 172.18.4.184 rac2 192.168.56.20 rac2 PRI ...

  6. Java后端技术微信交流群!工作、学习、技术、资源等!期待你的加入!

    <Java后端技术>专注Java相关技术:SSM.Spring全家桶.微服务.MySQL.MyCat.集群.分布式.中间件.Linux.网络.多线程,偶尔讲点运维Jenkins.Nexus ...

  7. (十八)python 3 回调函数

    回调函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的 ...

  8. python 模块学习(二)

    一.日志模块(logging ) 日志是一种追踪软件运行时所发生事件的方法 1.简单的日志编写(文件输出) import logging # 日志模块 # 日志配置,把日志内容存到文件中 loggin ...

  9. Milk(sort+结构体)

    Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to choose a bot ...

  10. [MVC]在练习MusicStore过程中问题实录

    1,问题描述:MVC在添加基于框架的控制器时,出现无法检索xxx的元数据 参考目录:http://www.cnblogs.com/0banana0/p/4050793.html#undefined 解 ...