lintcode 中等题:Single number III 落单的数III
题目
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
给出 [1,2,2,3,4,4,5,3],返回 1和5
O(n)时间复杂度,O(1)的额外空间复杂度
解题
根据落单的数I,可以想到,所有的数进行异或运行的结果就是所求两个数的异或结果。
这个异或的结果,二进制数是1的位置说明这两个数对应的二进制位不相同。然后再怎么还原???
参考,理解的不是很透,找到第k位后,再判断数组中所以数的第k位是0 还是1,,出现两次的数对求解无影响,通过这个第k为把数组分成两类,也就把两个数分开了,这里的第k位在a、b中一定不相同的,一定是一个0一个1。
- public class Solution {
- /**
- * @param A : An integer array
- * @return : Two integers
- */
- public List<Integer> singleNumberIII(int[] A) {
- // write your code here
- int axorb = 0;
- LinkedList<Integer> res = new LinkedList<Integer>();
- for( int i = 0; i <A.length;i++){
- axorb ^= A[i];
- }
- int a = 0;
- int b = 0;
- int k = 0;
- while( axorb % 2==0){
- axorb >>= 1;
- k++;
- }
- for(int i=0;i< A.length;i++){
- int tmp =( A[i]>>k)%2;
- if(tmp==0)
- a ^= A[i];
- else
- b ^= A[i];
- }
- res.add(a);
- res.add(b);
- return res;
- }
- }
Java Code
总耗时: 3520 ms
- class Solution:
- """
- @param A : An integer array
- @return : Two integer
- """
- def singleNumberIII(self, A):
- # write your code here
- x = 0
- for num in A:
- x ^= num
- a = 0
- b = 0
- k = 0
- while x%2==0:
- x = x>>1
- k +=1
- for num in A:
- tmp = (num>>k)%2
- if tmp==0:
- a ^=num
- else:
- b ^=num
- return [a,b]
Python Code
总耗时: 514 ms
当然对于这样的题目,利用HashMap是最简单不过的了。
- public class Solution {
- /**
- * @param A : An integer array
- * @return : Two integers
- */
- public List<Integer> singleNumberIII(int[] A) {
- // write your code here
- HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
- LinkedList<Integer> res = new LinkedList<Integer>();
- for(int i=0;i<A.length;i++){
- if(map.containsKey(A[i])){
- map.put(A[i],map.get(A[i]) + 1);
- }else{
- map.put(A[i],1);
- }
- if(map.get(A[i]) ==2)
- map.remove(A[i]);
- }
- for(Integer k:map.keySet()){
- res.add(k);
- }
- return res;
- }
- }
Java Code
总耗时: 4318 ms
优化一下
- public class Solution {
- /**
- * @param A : An integer array
- * @return : Two integers
- */
- public List<Integer> singleNumberIII(int[] A) {
- // write your code here
- HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
- LinkedList<Integer> res = new LinkedList<Integer>();
- for(int i=0;i<A.length;i++){
- if(map.containsKey(A[i])){
- map.remove(A[i]);
- }else{
- map.put(A[i],1);
- }
- }
- for(Integer k:map.keySet()){
- res.add(k);
- }
- return res;
- }
- }
Java Code
总耗时: 3995 ms
- class Solution:
- """
- @param A : An integer array
- @return : Two integer
- """
- def singleNumberIII(self, A):
- # write your code here
- d = {}
- for num in A:
- if num in d:
- del d[num]
- else:
- d[num] = 1
- return d.keys()
Python Code
总耗时: 586 ms
lintcode 中等题:Single number III 落单的数III的更多相关文章
- LeetCode 136. Single Number (落单的数)
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- lintcode 中等题:Singleton number II 落单的数 II
题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...
- 84 落单的数 III
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- LintCode笔记 - 82.落单的数
这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 落单的数 中文English 给出 * n ...
- lintcode:落单的数
题目: 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 样例 给出 [1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度 ...
- LinCode落单的数
easy 落单的数 查看执行结果 60% 通过 给出2*n + 1 个的数字,除当中一个数字之外其它每一个数字均出现两次.找到这个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1, ...
- lintcode-84-落单的数 III
84-落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- 83 落单的数 II
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...
随机推荐
- linux解压zip、bz、bz2、z、gz、tar(解包)
zip: 压缩: zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>] ...
- mysql 让一个存储过程定时作业的代码
1.在mysql 中建立一个数据库 test1 语句:create database test1 2.创建表examinfo create table examinfo( id int auto_in ...
- jQuery实现用户注册的表单验证
用户注册的表单往往是需要进行验证的,否则会有一些不否合规则的数据入库,后果会不堪设想,本文通过jquery来实现. <html> <head> <meta chars ...
- 精美舒适的对话消息提示框--第三方开源--SweetAlertDialog
SweetAlertDialog(sweet-alert-dialog)是一个套制作精美.动画效果出色生动的Android对话.消息提示框 SweetAlertDialog(sweet-alert-d ...
- SQL Server中如何用mdf,ldf文件还原数据库
不论是手动还原还是写个脚本还原,首先都要修改文件的属性为可读写,另外这个用户能够修改 1.手动Attach 2.写个脚本还原 我个人比较喜欢写个脚本去还原 Exec sp_attach_db @dbn ...
- Vim配置IDE开发环境
我的vim IDE界面: 1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get instal ...
- python之super()函数
python之super()函数 python的构造器奇特, 使用魔方. 构造器内对基类对象的初始化同样也很奇特, 奇特到没有半点优雅! 在构造器中使用super(class, instance)返回 ...
- 微软职位内部推荐-Sr SDE for Win Apps Ecosystem
微软近期Open的职位: Job posting title: Senior Software Design Engineer Location: China, Beijing Level: 63 D ...
- 关于6410的sd卡和nandflash启动的区别
今天在公司我们队长问我个问题,关于cortex的sd启动流程和nandflash的启动流程,一下想不起来了,中午闲来无事就整理了整理当初6410的两种启动方式的区别.在这里写一下.有不对的请指点,我对 ...
- Source Insight中文操作支持的宏
以下是Source Insight中文字符串支持的宏的实现,在此做个备份. 代码来自网上,非笔者所写.原有代码有个明显的Bug(Del的时候会导致多删除一个字符和多插入一个空格),已经被笔者fix掉. ...