【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 ...
随机推荐
- 一个iOS 框架介绍:MKNetworkKit
http://blog.csdn.net/kmyhy/article/details/12276287 http://blog.csdn.net/mobailwang/article/details/ ...
- How can I determine the URL that a local Git repository was originally cloned from?
git remote show origin from: http://stackoverflow.com/questions/4089430/how-can-i-determine-the-url- ...
- JavaScript——Prototype详探
用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...
- visual studio 2012 插件
下面来分享几个好用的插件:直接在Tools-Extensions and Updates-Online中搜索就可以安装了 (中文版位于:菜单-工具-扩展和更新-联机-Visual Studio库) 1 ...
- 使用Java数组实现双色球选号
package com.hm.test; import java.util.Random; /** * 模拟双色球生成 * *1.从1到16中产生一个篮球的随机数 *2.从1到33中产生出6个红色的球 ...
- ios 获得设备型号方法
以前用UIScreen 的大小来判断设备类型,现在有了iphone6 和 iphone6 plus, 这种方法不能用了.因为当程序不提供相应的启动图片时,系统会把程序运行在320*568的size下, ...
- pydev导入eclipse
编辑器:Python 自带的 IDLE 简单快捷, 学习Python或者编写小型软件的时候.非常有用. 编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就 ...
- WCF重写ServiceHost,实现独立配置文件
有时我们需要将WCF的配置文件放在单独的配置文件中,而默认情况下WCF又是在web.config或app.config中去寻找服务配置.如果我们把配置文件放在另一个config文件中,如何让WCF知道 ...
- September 4th 2016 Week 37th Sunday
The morning crowned the humble cloud with splendor. 晨光为谦逊的白云披上壮丽的光彩. Humility is a virtue. Many famo ...
- 立方体旋转 【web前端学习部落22群120342833】
效果: HTML部分: <body class="body"> <div class="rect-wrap"> <!-- // ...