异或巧用: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. sqlserver差异备份3117

    1.出现错误"3117" 2.完整备份/选项/不对数据库执行任何操作 3.数据库显示"正在还原" 4.差异备份/选项/回滚 5.数据库完整备份与差异备份成功

  2. centos7 rsync+inotify软件实现集群服务的数据备份(二)

    上一篇文章记录了怎么安装rsync以及怎么使用该服务备份数据,但是在集群中需要实时备份客户发过来的相关数据,这样在使用命令或者定时任务的方式执行备份, 就满足不了整个服务的需求了. inotify是一 ...

  3. Python数据分析 Pandas模块 基础数据结构与简介(一)

    pandas 入门 简介 pandas 组成 = 数据面板 + 数据分析工具 poandas 把数组分为3类 一维矩阵:Series 把ndarray强大在可以存储任意数据类型可以专门处理时间数据 二 ...

  4. POJ 1511 Invitation Cards (最短路的两种方法spfa, Dij)

    题意: 给定n个点, m条路, 求1到 2 ~n的最短路之和加上2~n到1的最短路之和 分析: 裸最短路, 求其他点到源点的距离只需要把边方向再从源点求一次即可 spfa代码 #include< ...

  5. Linux mint xfce 19 使用记录

    创建系统快照 创建系统快照是 Linux Mint 19 的重要建议,可以使用与更新管理器捆绑的 Timeshift 应用程序轻松完成创建与恢复. 这个阶段很重要,万一出现令人遗憾的事件,比如安装破坏 ...

  6. 洛谷 P1434 [SHOI2002]滑雪

    这道题适合记忆化练手 毕竟总有些大佬虐题. 这个题有几个剪枝 1.记忆化 这个不用多说了吧 剪枝就是 如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度 那么反过来,这个点不 ...

  7. POJ-2387Til the Cows Come Home,最短路坑题,dijkstra+队列优化

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K       http://poj.org/problem?id=238 ...

  8. hdu4135 Co-prime【容斥原理】

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. SQL Server 创建唯一约束sql语句

    SQL Server 创建唯一约束sql语句   语句示例:   在创建表是时同时创建, 创建id,name,sex三个字段的唯一索引 create table t1( id int primary ...

  10. 在eclipse中画类图

    学习设计模式的时候,希望能够画出类图,理清关系.但是StarUML还有重新去写类名.属性.方法等,不是很方便.网上给出了安装插件的方法额,就可以直接在eclipse中拖拽类,很方便.但是网上给出的插件 ...