lintcode 落单的数(位操作)
题目1 落单的数
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。
链接:http://www.lintcode.com/zh-cn/problem/single-number/
样例
给出 [1,2,2,1,3,4,3],返回 4
挑战
一次遍历,常数级的额外空间复杂度
解决方案
方法1思路:将所有的数转换成二进制,因为是int类型,共32位。申请常数级(32位)的额外空间,然后每个数对应的位相加,最后对应位上的和模2。最后的结果就是单个数对应的二进制数。
class Solution {
public:
/**
* @param A: Array of integers.
* return: The single number.
*/
int singleNumber(vector<int> &A) {
// write your code here
int ans[];
memset(ans, , sizeof(ans));
for(int i=; i<A.size(); ++i){
for(int k=; k<; k++)
ans[k] = (ans[k]+((A[i]>>k)&))%;
} int ret = ;
int base = ;
for(int i=; i<; ++i){
ret += ans[i]*base;
base *= ;
}
return ret;
}
};
方法2思路:通过异或,相同的数结果为0,那么最后的结果一定是落单的数字。
class Solution {
public:
/**
* @param A: Array of integers.
* return: The single number.
*/
int singleNumber(vector<int> &A) {
// write your code here
int ans = ;
for(int i=; i<A.size(); ++i)
ans ^= A[i];
return ans;
}
};
题目2 落单的数 II
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。
链接:http://www.lintcode.com/zh-cn/problem/single-number-ii/
样例
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
挑战
一次遍历,常数级的额外空间复杂度
解决方案
同上一题的方法1一样的思路。
class Solution {
public:
/**
* @param A : An integer array
* @return : An integer
*/
int singleNumberII(vector<int> &A) {
// write your code here int ans[];
memset(ans, , sizeof(ans));
for(int i=; i<A.size(); ++i){
for(int k=; k<; k++)
ans[k] = (ans[k]+((A[i]>>k)&))%;
} int ret = ;
int base = ;
for(int i=; i<; ++i){
ret += ans[i]*base;
base *= ;
}
return ret;
}
};
题目3:落单的数 III
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
链接:http://www.lintcode.com/zh-cn/problem/single-number-iii/
样例
给出 [1,2,2,3,4,4,5,3],返回 1和5
挑战
O(n)时间复杂度,O(1)的额外空间复杂度
解决方案
如上图所示,所有数的异或的结果等于两个落单数异或的结果(设为S)。如何根据这个异或的结果将落单的数找出来呢?首先,S的值一定不为0,那么找到S对应的二进制数值为1的位(找到任意一个位为1都行, 这里我们找到S的二进制最后一个为1的位,设为P),根据这一个位置,将所有的数划分成两部分,一部分是对应二进制P位是1,另一部分对应二进制P位是0。这样就把两个落单的数划分到了不同的集合里去了。如上图的红色框集合和绿色框集合。然后就转换成“2*m+1个数字,除了一个数字其他数字均出现两次”的问题,也就是题目1:落单的数I。
class Solution {
public:
/**
* @param A : An integer array
* @return : Two integers
*/ int findNum(int k, vector<int> &A, bool flag){
int ret = ;
for(int i=; i<A.size(); ++i){
if(flag && (<<k)&A[i])
ret ^= A[i];
if(!flag && !((<<k)&A[i]))
ret ^= A[i];
}
return ret;
}
vector<int> singleNumberIII(vector<int> &A) {
// write your code here
int x = ;
for(int i=; i<A.size(); ++i)
x ^= A[i];
int k = ;
for(k; k<; ++k)//找到异或值最后一个1,说明该位置P之后,两个不同的数对应的二进制是相同的
if((<<k)&x)
break;
//根据这个位置P,转换成“2*m+1个数字,除了一个数字其他数字均出现两次”的问题
//将位置P上对应为1的数字异或得到一个数字,然后再将位置P上对应为0的数字异或得到一个数字,最后得到答案
vector<int> ans;
ans.push_back(findNum(k, A, true));
ans.push_back(findNum(k, A, false));
return ans;
}
};
lintcode 落单的数(位操作)的更多相关文章
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- lintcode 中等题:Singleton number II 落单的数 II
题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...
- lintcode:落单的数
题目: 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 样例 给出 [1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度 ...
- LintCode笔记 - 82.落单的数
这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 落单的数 中文English 给出 * n ...
- 83 落单的数 II
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...
- 84 落单的数 III
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...
- [codevs3295]落单的数
题目描述 Description 有n个数(n是奇数),其中n-1个数两两成对,有1个数落单,找出这个数.要求O(n)的时间复杂度,O(1)的空间复杂度 输入描述 Input Description ...
- LeetCode 136. Single Number (落单的数)
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- LinCode落单的数
easy 落单的数 查看执行结果 60% 通过 给出2*n + 1 个的数字,除当中一个数字之外其它每一个数字均出现两次.找到这个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1, ...
随机推荐
- 如何使CEF支持Flash
方法一:复制Chrome浏览器下的pepperFlash,通过cef命令行参数设置路径. public Form1() { InitializeComponent(); InitializeChrom ...
- Win 通过修改注册表把CapsLock映射为Rshift
成品: REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancod ...
- JavaScript-Object基础知识
1. 定义:对象是JS的核心概念,也是最重要的数据类型.js的所有数据都可以被视为对象. 对象是一种无序的数据集合,由若干个键值对(key:value)构成,由{ ...
- github for windows 安装 使用
遇到无数的未知问题.光是安装就搞了好久. 安装程序显示安装了.NET Framework4.5,然后提示重启.重启后,自动开始下载文件,最多到2%就走不动了. 后来请求了下面这个链接,才开始下载了(虽 ...
- Torch7学习笔记(二)nn Package
神经网络Package [目前还属于草稿版,等我整个学习玩以后会重新整理] 模块Module module定义了训练神经网络需要的所有基础方法,并且是可以序列化的抽象类. module有两种状态变量: ...
- ThreadPoolExecutor源码学习(1)-- 主要思路
ThreadPoolExecutor是JDK自带的并发包对于线程池的实现,从JDK1.5开始,直至我所阅读的1.6与1.7的并发包代码,从代码注释上看,均出自Doug Lea之手,从代码上看JDK1. ...
- 防止XSS攻击的方法
什么是XSS? 使用Jsoup来防止XSS攻击 Jsoup官网 Jsoup中文 maven包引入 <dependency> <groupId>org.jsoup</gro ...
- OpenCV 3.1 Set Camera Resolution 设置相机的分辨率
在OpenCV中,有强大的处理相机事件的api,但是貌似没有直接获取相机的最大分辨率的函数,通过属性CV_CAP_PROP_FRAME_HEIGHT和CV_CAP_PROP_FRAME_WIDTH直接 ...
- ANT_HOME is set incorrectly or ant could not be located .Please set ANT_HOME.
今天配置ant,奶奶的老是报错. 因为环境变量 ANT_HOME 和 JAVA_HOME 设置值不能有“;” ,把分号去掉即可成功了. 神奇!
- Android ANR 分析解决方法
一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...