84 落单的数 III
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/#
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
给出 [1,2,2,3,4,4,5,3],返回 1和5
O(n)时间复杂度,O(1)的额外空间复杂度
class Solution {
public:
/*
* @param A: An integer array
* @return: An integer array
*/
vector<int> singleNumberIII(vector<int> &A) {
// write your code here
vector<int> result;
if (A.empty())
{
return result;
}
int size=A.size();
sort(A.begin(),A.end());
for (int i=;i<size-;i+=)
{
if (A[i]-A[i+]!=)
{
result.push_back(A[i]);
A.push_back(A[i]);
break;
}
}
int temp=;
for (int j=;j<(int)A.size();j++)
{
temp=temp^A[j];
}
result.push_back(temp);
return result;
}
};
挑战版: 参考 https://blog.csdn.net/guoziqing506/article/details/52231357
我们之前已经做过两道类似的题目,分别是落单的数,落单的数 II,思路都是位运算。这道题也不例外。
不过这道题想出方法来倒还真不太容易,至少我当时没想出来,也是后来查了别人的做法,才知道的,在此,我将别人的方法用我的话再说一遍,努力让它更好理解。
当然,首先想到的就是跟之前2*n + 1个数时的情况一样(详见:落单的数),先将所有的数异或一遍,这样,我们就将数组中那两个不同的数异或到了一个结果中(此处不懂的话看刚才给的链接)。现在的难处在于无法将这个结果拆开,拆成我们想要的那两个不同的数。
怎么办呢?我们如果对二进制足够熟悉,就不难得出这样一个结论,这个异或的结果(为方便描述,记为Xor)的二进制位中为1的位,必然是这两个不同的数(方便起见,记为first 和 second)不同的位,也就是说,first和second在这些位中一个是1,一个是0。不失一般性,我们就找Xor中第一个为1的位,将这个位数记为k.
那么,一定隐含了这样一个逻辑:在成对的2*n个数当中,一定有2x个数的第k位是1,而有2y个数的第k位是0,其中,x + y = n,所以,
换个说法,既然Xor的第k为是1,那我们不妨假设first的第k位是0,而second的第k位是1。那么,如果令x个数第k位为1的数,和second一起,与Xor异或,就能得到first,这个道理与2n + 1时是一样的。而再令first与Xor异或,就能得到second.
于是,可以按以下步骤操作:
1. 将数组中所有的数异或,得到一个结果,记为Xor
2. 查出Xor中第一个为1的位(也就是为1的最小的位),记为k
3. 查出数组中所有第k位为1的数(这里面当然包括second)与Xor异或,得到first
4. 将first与Xor异或,得到second
PS:位运算不会改变原变量的值。要改变原变量的值需要经过赋值表达式实现。
vector<int> singleNumberIII(vector<int> &A)
{
vector<int> result;
int temp=;
for (int i=;i<(int)A.size();i++)
{
temp=temp^A[i];
}
int first=temp;
int second=temp; int k=;
for (;k<;k++)
{
if(temp>>k&)
break;
} for (int j=;j<(int)A.size();j++)
{
if (A[j]>>k&)
{
first=first^A[j];
}
}
second=second^first; //second=temp^first;
result.push_back(first);
result.push_back(second);
return result;
}
其他参考:
https://blog.csdn.net/wangyuquanliuli/article/details/46638551
84 落单的数 III的更多相关文章
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- lintcode-84-落单的数 III
84-落单的数 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 挑战 一次遍历,常数级的额外空间复杂度 ...
- [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, ...
- 83 落单的数 II
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...
随机推荐
- NodeJS学习笔记之Connect中间件应用实例
一,开篇分析 大家好哦,大熊君又来了,昨天因为有点个人的事没有写博客,今天又出来了一篇,这篇主要是写一个记事本的小应用,前面的文章, 我也介绍过“Connect”中间件的使用以及“Mongodb”的用 ...
- 03、request 模块高级
requests高级部分 代理 cookie 验证码的识别 模拟登陆 代理 代理概念:代理服务器. 作用:接受请求==>请求转发. 代理和爬虫之间的关联: 可以使用请求转发的机制使得目的服务器接 ...
- Codeforces Round #525 D - Ehab and another another xor problem /// 构造
题目大意: 本题有两个隐藏起来的a b(1<=a,b<=1e30) 每次可 printf("? %d %d\n",c,d); 表示询问 a^c 与 b^d 的相对大小 ...
- eclipse新建maven项目和聚合项目
1.new maven project : next 2.勾选 create a simple project : next 3.Group Id:项目的包路径 如com.jiayou.zjl, ...
- Spark运行基本流程
- Windows系统查看xxx.dll、xxx.lib文件的导出函数、依赖文件等信息的方法
1.查看xxx.dll或xxx.exe文件的导出函数.依赖文件等信息,使用Depends软件即可. 2.查看xxx.lib文件的导出函数.依赖文件等信息,使用Visual Studio附带工具dump ...
- 使用Element的upload上传组件,不使用action属性上传
1.需要实现的效果如下图,在点击提交的时候再提交file数据,和其他数据统一上传,我把file转换成了base64的格式,可以再上传之前显示缩略图 2.代码分析 action属性值为"#&q ...
- Scala 方法与函数简单记录
/** * Scala 方法与函数 * Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 */ o ...
- excel批量删除sql语句
数据如下表一样 在E1列输入update sql 模板 ="update test set A= '"&A1&"' ,B = '"&B1 ...
- CSS——背景渐变
在线性渐变过程中,颜色沿着一条直线过渡:从左侧到右侧.从右侧到左侧.从顶部到底部.从底部到顶部或着沿任何任意轴.如果你曾使用过制作图件,比如说Photoshop,你对线性渐变并不会陌生. 兼容性问题很 ...