题目描述:

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. NDK学习三: 纯手工编译Hello World

      1.配置环境变量 添加make工具path环境变量: E:\Android\android-ndk-r10b\prebuilt\windows-x86_64\bin     2.编写Hello W ...

  2. redis配置文件redis.conf参数说明

    redis配置文件redis.conf参数说明 (2013-01-09 21:20:40)转载▼ 标签: redis配置 redis.conf 配置说明 杂谈 分类: nosql # By defau ...

  3. Oracle开发之窗口函数 rows between unbounded preceding and current row

    目录=========================================1.窗口函数简介2.窗口函数示例-全统计3.窗口函数进阶-滚动统计(累积/均值)4.窗口函数进阶-根据时间范围统计 ...

  4. js隐藏div和class

    <style type="text/css"> //div用点//class# .footer {  display:none;  } #footer {  displ ...

  5. python读写文件时中文的转码问题

    读写文件都要将中文转为unicode字符. 读文件: u = unicode(s, 'gbk') 这里不能使用encode 写文件: u = encode('utf')

  6. centos6.5 iptables结合ipset批量屏蔽ip

    安装ipset yum install ipset #创建ip地址集合 ipset create bansms hash:net 查找访问了“getVerificationCode”并且次数大于10次 ...

  7. serv-u启动管理控制台后提示脚本错误解决方案

             问题描述: 安装serv-u后打开管理控制台,提示“脚本错误“控制台界面无法正常显示: 解决方法: 1.在serv-u安装目录下找到”Serv-U-DefaultCertificat ...

  8. markdown 基本语法

    代码块: ```console.log(1);```--- 标题: # h1## h2### h3 --- 粗斜体: *斜体***粗体*****粗斜体*** --- 强调:`强调` --- 链接:[百 ...

  9. MySQL key_len 大小的计算

    背景: 当用Explain查看SQL的执行计划时,里面有列显示了 key_len 的值,根据这个值可以判断索引的长度,在组合索引里面可以更清楚的了解到了哪部分字段使用到了索引. 环境: CREATE ...

  10. ajax与后台交互传输数据的工具类

    public class Result<T> implements Serializable { private static final long serialVersionUID = ...