题目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 落单的数(位操作)的更多相关文章

  1. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  2. lintcode 中等题:Singleton number II 落单的数 II

    题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...

  3. lintcode:落单的数

    题目: 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 样例 给出 [1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度 ...

  4. LintCode笔记 - 82.落单的数

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 落单的数 中文English 给出 * n ...

  5. 83 落单的数 II

    原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...

  6. 84 落单的数 III

    原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...

  7. [codevs3295]落单的数

    题目描述 Description 有n个数(n是奇数),其中n-1个数两两成对,有1个数落单,找出这个数.要求O(n)的时间复杂度,O(1)的空间复杂度 输入描述 Input Description ...

  8. LeetCode 136. Single Number (落单的数)

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  9. LinCode落单的数

    easy 落单的数 查看执行结果 60% 通过 给出2*n + 1 个的数字,除当中一个数字之外其它每一个数字均出现两次.找到这个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1, ...

随机推荐

  1. 【异常】No ManagedConnections available within configured blocking timeout

    Caused by: org.jboss.util.NestedSQLException: No ManagedConnections available within configured bloc ...

  2. asp.net中用cookie记住密码上次不用登陆

    ------最佳解决方案--------------------写入CookieResponse.Cookies["UserName"].Value = "用户名&quo ...

  3. linu for循环

    用途说明 在shell中用于循环.类似于其他编程语言中的for,但又有些不同.for循环是Bash中最常用的语法结构. 常用格式 格式一 for 变量 do 语句 done 格式二 for 变量 in ...

  4. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  5. Python之路第一课Day4--随堂笔记(迭代生成装饰器)

    上节回顾: 1.集合 a.关系测试 b.去重 2.文件操作及编码 3.函数 4.局部变量和全局变量 上节回顾 本节课内容: 1.迭代器生成器 2.装饰器 3.json pickle数据序列化 4.软件 ...

  6. 10分钟学会前端调试利器——FireBug

    概述 FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件.它可以用于调试JavaScript.查看DOM.分析CSS.监控网络流量以及进行Ajax交互等.它提供了几乎前 ...

  7. Awstats显示国家地区插件GeoIP安装

    Awstats默认安装之后是不具有识别访问者的国家和地区信息的,所以需要安装插件支持Awstats列出访问者的国家和地区,便于分析GeoIP免费的是国家/IP的数据表,GeoIPCityLite是地区 ...

  8. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...

  9. Linux tar文件打包

    tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c    //打包 -x    //解压 -f    //指定文件 ...

  10. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...