题目

给出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。

  1. public class Solution {
  2. /**
  3. * @param A : An integer array
  4. * @return : Two integers
  5. */
  6. public List<Integer> singleNumberIII(int[] A) {
  7. // write your code here
  8. int axorb = 0;
  9. LinkedList<Integer> res = new LinkedList<Integer>();
  10. for( int i = 0; i <A.length;i++){
  11. axorb ^= A[i];
  12. }
  13. int a = 0;
  14. int b = 0;
  15. int k = 0;
  16. while( axorb % 2==0){
  17. axorb >>= 1;
  18. k++;
  19. }
  20. for(int i=0;i< A.length;i++){
  21. int tmp =( A[i]>>k)%2;
  22. if(tmp==0)
  23. a ^= A[i];
  24. else
  25. b ^= A[i];
  26. }
  27. res.add(a);
  28. res.add(b);
  29. return res;
  30. }
  31. }

Java Code

总耗时: 3520 ms

  1. class Solution:
  2. """
  3. @param A : An integer array
  4. @return : Two integer
  5. """
  6. def singleNumberIII(self, A):
  7. # write your code here
  8. x = 0
  9. for num in A:
  10. x ^= num
  11. a = 0
  12. b = 0
  13. k = 0
  14. while x%2==0:
  15. x = x>>1
  16. k +=1
  17. for num in A:
  18. tmp = (num>>k)%2
  19. if tmp==0:
  20. a ^=num
  21. else:
  22. b ^=num
  23. return [a,b]

Python Code

总耗时: 514 ms

当然对于这样的题目,利用HashMap是最简单不过的了。

  1. public class Solution {
  2. /**
  3. * @param A : An integer array
  4. * @return : Two integers
  5. */
  6. public List<Integer> singleNumberIII(int[] A) {
  7. // write your code here
  8. HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
  9. LinkedList<Integer> res = new LinkedList<Integer>();
  10. for(int i=0;i<A.length;i++){
  11. if(map.containsKey(A[i])){
  12. map.put(A[i],map.get(A[i]) + 1);
  13. }else{
  14. map.put(A[i],1);
  15. }
  16. if(map.get(A[i]) ==2)
  17. map.remove(A[i]);
  18. }
  19. for(Integer k:map.keySet()){
  20. res.add(k);
  21. }
  22. return res;
  23. }
  24. }

Java Code

总耗时: 4318 ms

优化一下

  1. public class Solution {
  2. /**
  3. * @param A : An integer array
  4. * @return : Two integers
  5. */
  6. public List<Integer> singleNumberIII(int[] A) {
  7. // write your code here
  8. HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
  9. LinkedList<Integer> res = new LinkedList<Integer>();
  10. for(int i=0;i<A.length;i++){
  11. if(map.containsKey(A[i])){
  12. map.remove(A[i]);
  13. }else{
  14. map.put(A[i],1);
  15. }
  16. }
  17. for(Integer k:map.keySet()){
  18. res.add(k);
  19. }
  20. return res;
  21. }
  22. }

Java Code

总耗时: 3995 ms

  1. class Solution:
  2. """
  3. @param A : An integer array
  4. @return : Two integer
  5. """
  6. def singleNumberIII(self, A):
  7. # write your code here
  8. d = {}
  9. for num in A:
  10. if num in d:
  11. del d[num]
  12. else:
  13. d[num] = 1
  14. return d.keys()

Python Code

总耗时: 586 ms

lintcode 中等题:Single number III 落单的数III的更多相关文章

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

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

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

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

  3. 84 落单的数 III

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

  4. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

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

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

  6. lintcode:落单的数

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

  7. LinCode落单的数

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

  8. lintcode-84-落单的数 III

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

  9. 83 落单的数 II

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

随机推荐

  1. linux解压zip、bz、bz2、z、gz、tar(解包)

    zip: 压缩: zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>] ...

  2. mysql 让一个存储过程定时作业的代码

    1.在mysql 中建立一个数据库 test1 语句:create database test1 2.创建表examinfo create table examinfo( id int auto_in ...

  3. jQuery实现用户注册的表单验证

    用户注册的表单往往是需要进行验证的,否则会有一些不否合规则的数据入库,后果会不堪设想,本文通过jquery来实现. <html>  <head>  <meta chars ...

  4. 精美舒适的对话消息提示框--第三方开源--SweetAlertDialog

    SweetAlertDialog(sweet-alert-dialog)是一个套制作精美.动画效果出色生动的Android对话.消息提示框 SweetAlertDialog(sweet-alert-d ...

  5. SQL Server中如何用mdf,ldf文件还原数据库

    不论是手动还原还是写个脚本还原,首先都要修改文件的属性为可读写,另外这个用户能够修改 1.手动Attach 2.写个脚本还原 我个人比较喜欢写个脚本去还原 Exec sp_attach_db @dbn ...

  6. Vim配置IDE开发环境

    我的vim IDE界面: 1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get instal ...

  7. python之super()函数

    python之super()函数 python的构造器奇特, 使用魔方. 构造器内对基类对象的初始化同样也很奇特, 奇特到没有半点优雅! 在构造器中使用super(class, instance)返回 ...

  8. 微软职位内部推荐-Sr SDE for Win Apps Ecosystem

    微软近期Open的职位: Job posting title: Senior Software Design Engineer Location: China, Beijing Level: 63 D ...

  9. 关于6410的sd卡和nandflash启动的区别

    今天在公司我们队长问我个问题,关于cortex的sd启动流程和nandflash的启动流程,一下想不起来了,中午闲来无事就整理了整理当初6410的两种启动方式的区别.在这里写一下.有不对的请指点,我对 ...

  10. Source Insight中文操作支持的宏

    以下是Source Insight中文字符串支持的宏的实现,在此做个备份. 代码来自网上,非笔者所写.原有代码有个明显的Bug(Del的时候会导致多删除一个字符和多插入一个空格),已经被笔者fix掉. ...