leetcode-137-Single Number II-第一种解法
题目描述:
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
要完成的函数:
int singleNumber(vector<int>& s)
说明:
1、这道题和上一道题一样,要求时间复杂度是线性的,要求不能使用空间复杂度是O(1)的。但不同的是这次除了一个数只出现一次,其余所有数都出现了三次。我们又要怎么解决这道题呢?
2、同样直接上讨论区代码,再次膜拜大神。大神使用了一种统计的方法,不过不是我等平常思维的统计每个数出现了几次,而是开了一个长度为32的数组,统计每个二进制位出现了几次,最后对3取模(如果是出现了K次就对K取模),取模完哪一位不是3的整倍数,就说明只出现了一次的那个数,在这个位上为1,最终可以求出最后的结果。以下举例说明。
举例说明:
c++中存储一个int型整数,都是32位的空间,我们也开32位的数组。但以下为了表示简便,我们只用最后的4位,就足够了。
假定我们的array of integers为[1,2,2,1,1,2,4,4,5,4],写成二进制位就是:
1:0001
2:0010
2:0010
1:0001
1:0001
2:0010
4:0100
4:0100
5:0101
4:0100
T:0434
R:0101
(T表示total,合计,每一列的和。R表示对3取模完之后的结果)
然后对T中的数值,每一位都对3取模,可以看到:出现了3的整数倍次的,取模完结果都是0;出现了非3的整数倍次的,即只出现了一次的那个数,取模完结果都为1,说明只出现一次的那个数,在当前这个位有出现过,最后也可以求出这个值。
不得不赞叹二进制位的神奇,可以发挥出“记录”的效果。这要是三进制位,就不能这样子处理了。二进制位为1,表示出现过,在这种“1个只出现1次,其余都出现了n次”的题目中,可以发挥出奇效。
不过似乎不是O(n)的时间复杂度?
代码:
int singleNumber(vector<int>& s)
{
vector<int> t();//开辟一个32位的数组
int i,j,n;
for (i = ; i < s.size(); ++i)
{
n = s[i];
for (j = ; j >= ; --j)
{
t[j]+=(n&);//统计当前这个数的二进制位情况
n >>= ;
if (!n)
break;
}
}
int result= ;//表示最后的取模完的结果
for (j = ; j >= ; --j)
{
n = t[j] % ;
if (n)
result+=(<<(-j));
}
return res;
}
leetcode-137-Single Number II-第一种解法的更多相关文章
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- Leetcode 137 Single Number II 仅出现一次的数字
原题地址https://leetcode.com/problems/single-number-ii/ 题目描述Given an array of integers, every element ap ...
- [LeetCode] 137. Single Number II 单独数 II
Given a non-empty array of integers, every element appears three times except for one, which appears ...
- LeetCode 137 Single Number II(仅仅出现一次的数字 II)(*)
翻译 给定一个整型数组,除了某个元素外其余的均出现了三次. 找出这个元素. 备注: 你的算法应该是线性时间复杂度. 你能够不用额外的空间来实现它吗? 原文 Given an array of inte ...
- [LeetCode] 137. Single Number II 单独的数字之二
Given a non-empty array of integers, every element appears three times except for one, which appears ...
- 详解LeetCode 137. Single Number II
Given an array of integers, every element appears three times except for one, which appears exactly ...
- leetcode 137. Single Number II ----- java
Given an array of integers, every element appears three times except for one. Find that single one. ...
- Java [Leetcode 137]Single Number II
题目描述: Given an array of integers, every element appears three times except for one. Find that single ...
- LeetCode 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数
Given an array of integers, every element appears three times except for one, which appears exactly ...
- Java for LeetCode 137 Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
随机推荐
- Opencv Match Template(轮廓匹配)
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- 富文本编辑器和fastdfs的使用
宜立方商城的系统架构a) 功能介绍(项目架构,有哪些功能模块,这些功能模块如何实现?)b) 架构讲解工程搭建-后台工程c) 使用maven搭建工程(后台工程如何搭建?)d) 使用maven的tomca ...
- 让你大开眼界的10款Android界面设计
根据调查显示, iOS与Android的市场份额差距正越来越大.Android设备正在成为手机应用市场的主力军.如何从设计层面创造一个优美的app界面来吸引用户已然成为广大App开发者们必做的功课之一 ...
- JVM致命错误日志(hs_err_pid.log)解读
JVM致命错误日志(hs_err_pid.log)解读 摘自:https://blog.csdn.net/u013938484/article/details/51811400 2016年07月02日 ...
- matrix derivatives
来源:cs229 stanford Machine Learning Notes
- 【转载】Jedis对管道、事务以及Watch的操作详细解析
转载地址:http://blog.csdn.net/liyantianmin/article/details/51613772 1.Pipeline 利用pipeline的方式从client打包多条命 ...
- Web大文件(夹)上传(断点续传)控件发布-Xproer.HttpUploader6
版权所有 2009-2017荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- google earth 中的飞行模拟器的键盘控制
- java爬虫入门
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- VC++中GDI和GDI+ 的坐标系统介绍
在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...