题目描述:

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?

Single Number II

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

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

题目的意思都很直白,就是一个数组中只有一个元素只出现一次,其他都出现了两(三)次,求那个元素是什么。

我们首先从第一个问题开始思考,要在比较快的时间内找到只有一个的数,我们可以想到几种方式:

首先最容易想到的就是先排个序,那样就直接一遍遍李青松得出结果,但是排序的复杂度最快也就nlogn(基数排序类除外),所以这种方式在实践复杂度上来说不行(不过你只是想过题的话这种方法还是可以的)。

然后我们会想到时间换空间,也就是用一个标记数组进行操作,每次读入一个数字就把表技术组的相应位置为标记值,并且考虑到数字的范围问题我们还可以通过合适的hash策略进行求解,这种方法除了在实现上需要考虑到合适的hash函数之外应该都是不错的。知识由于表技术组的存在,需要o(n)的存储空间,还不是一个足够好的方法。

最后,我们考虑到除了我们要的那个值其他的值都会出现两次,就想到如果那两个一样的直接抵消了就好了,那么剩下的就是我们所需要的那个数了,那么有什么能干到这一点?对,就是位运算--异或,我们知道异或的运算法则是相同则为零,不同则唯一。并且位运算的结果和顺序是没有关系的,那么我们把两个相同的值疑惑起来结果必然为零,于是最后剩下的就是我们要的那个数了,代码如下:

那么我们现在来看第二个题,这个题与上面的不同就在那个三上面,分析一下我们发现,对于我们上面提到的第一种和第二种不优秀的解法没什么影响(往往不是最优秀的解法通用性都比较好)。但是第三种解法已经不能用了

分析一下发现我们已经不可能直接向上面那样用任意一种位运算求出这个解了,于是乎哀叹要是另外有那么个运算xxx是“有三个相同的则为0,否则为一”那就好了,我们就可以按照上一题一样的思路进行求解了。不过这个确实不存在,但是我们可以自己实现啊,当然直接实现一个这么高档的位运算符有点难,那我们就一位一位来吧。也就是说一位一位判断是不是出现了三次的倍数,是的话我们就置0,否则置1.代码如下:

当然由于位运算十分精妙肯定是还有很多不同解法了,但是我觉得上面的两种还是比较易于思考和理解的。希望能有所帮助

【leetcode】Single Number && Single Number II(ORZ 位运算)的更多相关文章

  1. 【LeetCode】52. N-Queens II(位运算)

    [题意] 输出N皇后问题的解法个数. [题解] 解法一:传统dfs回溯,模拟Q放置的位置即可,应该不难,虽然能通过,但是时间复杂度很高. 解法二:位运算大法好! 首先要明白这道题里两个核心的位运算 1 ...

  2. LeetCode | 289. 生命游戏(原地算法/位运算)

    记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...

  3. LeetCode 201 Bitwise AND of Numbers Range 位运算 难度:0

    https://leetcode.com/problems/bitwise-and-of-numbers-range/ [n,m]区间的合取总值就是n,m对齐后前面一段相同的数位的值 比如 5:101 ...

  4. leetcode 201. Bitwise AND of Numbers Range(位运算,dp)

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  5. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  6. 【LeetCode】137. Single Number II 解题报告(Python)

    [LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...

  7. LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor

    1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...

  8. [Leetcode]Single Number && Single Number II

    Given an array of integers, every element appears twice except for one. Find that single one. 非常简单的一 ...

  9. 【一天一道LeetCode】#260. Single Number III

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

随机推荐

  1. 【GoLang】GoLang 遍历 map、slice、array方法

    代码示例: map1 := make(map[string]string) map1["a"] = "AAA" map1["b"] = &q ...

  2. JavaScript——事件模型

    DOM事件流: DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件 ...

  3. meteor 为基础,联合 Apollo + React + React-Router

    Graphql with Apollo, Meteor and React: https://janikvonrotz.ch/2016/10/09/graphql-with-apollo-meteor ...

  4. Wijmo 5 与Breeze 的组合,及与METRONIC 的集成

    1.Wijmo 5  是支持ANGULARJS 的HTML5 控件   http://wijmo.gcpowertools.com.cn/ 官方试用版  C1Wijmo-Eval_5.20151.42 ...

  5. iOS UILocalNotification 每2周,每两个月提醒

    iOS 的UILocalNotification提醒提供了默认的重复频率,比如,一天,一个星期等等,但是对于非标准的频率,比如每,2周,每2个月,无法重复提醒. 我们的思路是在应用程序开始时,把即将发 ...

  6. yum简单安装salt master与minion

    首先得先安装epel的yum源: rpm -ivh http://mirrors.skyshe.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm 1.SaltS ...

  7. Python 生产环境MySQL数据库增量备份脚本

    MySQL数据库常用的办法是通过MySQLdump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题.前面写了一遍文章介绍xtrabackup的热备工具,见 http://w ...

  8. Urllib2 总结

    Urllib2 总结 介绍 Urllib2是用于获取URLs(统一资源定位符)的一个Python模块.它以urlopen函数的形式提供了非常简单的接口.能够使用各种不同的协议来获取网址.它还提供一个稍 ...

  9. Effective C++ -----条款15:在资源管理类中提供对原始资源的访问

    APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 对原始资源的访问可能经由显示转换(.get()成员函数或者指针取值 ...

  10. 在SpringMVC中获取request对象

    1.注解法 @Autowired private  HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...