【leetcode】Single Number && Single Number II(ORZ 位运算)
题目描述:
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 位运算)的更多相关文章
- 【LeetCode】52. N-Queens II(位运算)
[题意] 输出N皇后问题的解法个数. [题解] 解法一:传统dfs回溯,模拟Q放置的位置即可,应该不难,虽然能通过,但是时间复杂度很高. 解法二:位运算大法好! 首先要明白这道题里两个核心的位运算 1 ...
- LeetCode | 289. 生命游戏(原地算法/位运算)
记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...
- LeetCode 201 Bitwise AND of Numbers Range 位运算 难度:0
https://leetcode.com/problems/bitwise-and-of-numbers-range/ [n,m]区间的合取总值就是n,m对齐后前面一段相同的数位的值 比如 5:101 ...
- 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 ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor
1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...
- [Leetcode]Single Number && Single Number II
Given an array of integers, every element appears twice except for one. Find that single one. 非常简单的一 ...
- 【一天一道LeetCode】#260. Single Number III
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
随机推荐
- .Net Framework 3.5, 3.5 sp1 中文版离线安装
安装.Net Framework 3.5和3.5 sp1时会自动下载语言包. 解决办法:下载语言包,将语言包拷贝到安装里. 1.用压缩工具解压.NetFramework3.5 2.将语言包文件拷贝到c ...
- 转:JQuery选择器
选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理 解,它们本身用法就非常简单,我更希望的是它能够提升个人编 ...
- 转帖:如何建立与使用 Window setup project
原文地址: http://www.codeproject.com/Articles/12548/Visual-Studio-Windows-Application-Setup-Project
- CSS中的float与clear
参考: http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html http://www.cnblogs.com/iloveyou ...
- Android之Activity之间跳转
本人自学Android,想到什么就写点什么.主要是怕忘了,哈哈~请观者不要建议~ 今天写点Android窗口之间的跳转以及自己理解: 1.Android中窗口之间的跳转,就是Activity之间的跳转 ...
- ios 使用autolayout 后button 的frame 无法设置问题!
问题见这里,只能通过bounds和center进行设置!http://www.cocoachina.com/bbs/read.php?tid-236862.html 待研究!!!!~~~
- git命令使用
2015-07-15 11:59:11 git pull : 相当于 SVN up git status : 相当于 SVN st git add a.txt: 新添加文件 或者 将文件修改保存到索引 ...
- 手动编译并运行Java项目的过程
现在Java开发基本上就是IDE调试,如果跨平台打个jar包过去运行一般就可以了,但是有些情况比如需要引入外部依赖的时候,这个时候是不能直接运行的,还需要引入一些外部的参数,并不是简单的javac和j ...
- 如何为自己的windows 8系统的电脑更换锁屏壁纸
现在的人都喜欢个性,今天教大家如何设置自己想要的锁屏壁纸 工具/原料 Windows 8系统的笔记本电脑 方法/步骤 将鼠标移到电脑的右下方,点击设置按钮进入设置页面 找到更改电脑设置并点击进 ...
- nyoj_95_众数问题_map练习
众数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...