异或巧用:Single Number
来源:互联网 发布:约翰·特拉沃尔塔 知乎 编辑:程序博客网 时间:2024/05/24 06:39
异或巧用: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
- leetcode---Single Number---异或
- 136. Single Number异或
- [LeetCode]Single Number 异或的妙用
- Single Number 异或求单独数
- LeetCode 136 Single Number (异或)
- 136. Single Number-位运算,异或
- LeetCode 136:Single Number(异或操作)
- 136. Single Number (异或运算)
- LeetCode Single Number III 异或+补码
- LeetCode P136 Single Number及异或知识
- Single Number(异或的性质及运用)
- leetcode-136. Single Number 异或操作、切片
- 【leetcode】136. Single Number【java】使用异或
- LeetCode 136. Single Number (算法、异或)
- 136. Single Number and与、或、异或、取反、左移和右移运算
- [算法][LeetCode]Single Number——异或运算的巧妙运用
- [leetcode]Single Number(异或运算、for循环、数组length、复杂度)
- web前端杂记(1)--JS DOM树操作简记
- oracle笔记一(sql语句方面)
- 算法---二分查找
- Guice 学习(六)使用Provider注入服务( Provider Inject Service)
- iOS应用程序的生命周期(要多看)
- 异或巧用:Single Number
- cm 一键卸载 命令
- VS中dll项目总结
- iOS typeof( ) 的个人理解及简单使用
- 国内可以使用的英文搜索引擎
- Tomcat内存设置详解
- 文本文件的读取方式一
- iOS IAP 自动更新的订阅服务
- 《Java课程实习》日志(周二)