1. // 面试题56(一):数组中只出现一次的两个数字
  2. // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序
  3. // 找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
  4.  
  5. #include <iostream>
  6.  
  7. unsigned int FindFirstBitIs1(int num);
  8. bool IsBit1(int num, unsigned int indexBit);
  9.  
  10. void FindNumsAppearOnce(int data[], int length, int* num1, int* num2)
  11. {
  12. if (data == nullptr || length < )//判断边界
  13. return;
  14.  
  15. int resultExclusiveOR = ;
  16. for (int i = ; i < length; ++i)//讲究,0异或任何一个数就等于那个数,三个数连续异或,若两个一样的,会抵消,剩下的值就是第三个数
  17. resultExclusiveOR ^= data[i];
  18.  
  19. unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);//求出这组数里,某位为1
  20.  
  21. *num1 = *num2 = ;
  22. for (int j = ; j < length; ++j)//以此位为标志,分为两个数组,每个数组都有且只有一个数字,其个数为奇数
  23. {
  24. if (IsBit1(data[j], indexOf1))
  25. *num1 ^= data[j];
  26. else
  27. *num2 ^= data[j];
  28. }
  29. }
  30.  
  31. // 找到num从右边数起第一个是1的位
  32. unsigned int FindFirstBitIs1(int num)
  33. {
  34. int indexBit = ;
  35. while (((num & ) == ) && (indexBit < * sizeof(int)))
  36. {
  37. num = num >> ;//向右移1位
  38. ++indexBit;
  39. }
  40.  
  41. return indexBit;
  42. }
  43.  
  44. // 判断数字num的第indexBit位是不是1
  45. bool IsBit1(int num, unsigned int indexBit)
  46. {
  47. num = num >> indexBit;
  48. return (num & );
  49. }
  50.  
  51. // ====================测试代码====================
  52. void Test(const char* testName, int data[], int length, int expected1, int expected2)
  53. {
  54. if (testName != nullptr)
  55. printf("%s begins: ", testName);
  56.  
  57. int result1, result2;
  58. FindNumsAppearOnce(data, length, &result1, &result2);
  59.  
  60. if ((expected1 == result1 && expected2 == result2) ||
  61. (expected2 == result1 && expected1 == result2))
  62. printf("Passed.\n\n");
  63. else
  64. printf("Failed.\n\n");
  65. }
  66.  
  67. void Test1()
  68. {
  69. int data[] = { , , , , , , , };
  70. Test("Test1", data, sizeof(data) / sizeof(int), , );
  71. }
  72.  
  73. void Test2()
  74. {
  75. int data[] = { , };
  76. Test("Test2", data, sizeof(data) / sizeof(int), , );
  77. }
  78.  
  79. void Test3()
  80. {
  81. int data[] = { , , , , , };
  82. Test("Test3", data, sizeof(data) / sizeof(int), , );
  83. }
  84.  
  85. int main(int argc, char* argv[])
  86. {
  87. Test1();
  88. Test2();
  89. Test3();
  90. system("pause");
  91. return ;
  92. }

《剑指offer》第五十六题(数组中只出现一次的两个数字)的更多相关文章

  1. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  2. 《剑指offer》第十六题(数值的整数次方)

    // 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...

  3. 【剑指offer】面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...

  4. (剑指Offer)面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 这道题的简单版本是除了一个数字之外,其他数字都出现了两次,这个很简单,将所有的数异或一遍就 ...

  5. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  6. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  7. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  8. 《剑指Offer》面试题-二维数组中的查找

    题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...

  9. 剑指offer【01】- 二维数组中的查找(Java)

    在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...

  10. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

随机推荐

  1. fjwc2019 D2T1 直径 (构造)

    #181. 「2019冬令营提高组」直径 (这题构造题是我考场上唯一一A的题........) 先看这个特殊的Subtask4 Subtask 4(20pts):$\sqrt{1+8k}$​​​ 为整 ...

  2. linux检查系统CPU,内存,磁盘使用率

    #!/bin/bash CPU=`top -bn 1 -i -c | sed -n '3p' | awk -F ':' '{print$2}' | awk '{print$1}'` MEM=`free ...

  3. Linux基础笔记——RAID

    关于RAID RAID0:理论上来说一个有n块磁盘组成的raid0,它的读写是单个磁盘性能的n倍,具有低成本,高性能,低安全性,可用于可靠性不高的应用,如:视频.音频.临时数据存储等 RAID1:也称 ...

  4. undefined reference to `vtable for MyColor'

    MyColor是新建的类,原因是使用了QObject,但是系统没有反应过来 解决:从工程删除,再添加进去[QtCreator]

  5. Spring 学习——Spring JSR注解——@Resoure、@PostConstruct、@PreDestroy、@Inject、@Named

    JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正 ...

  6. if语句学习

    #print("您好,我叫周星驰") ''' x=1+2+3 print(x*4) print(x**x) a=input("请输入相应的数字a") a=int ...

  7. makefile基本操作

    多数内容copy自youtube的一个视频:https://www.youtube.com/watch?v=E1_uuFWibuM 执行环境:原作者是在Linux下做的视频,而我使用的是win10,w ...

  8. apache安装时的一些术语

    apache源码安装时,需要的哪些必须依赖模块? 主要需要apr, apr-util, pcre模块 其中 apr模块时必须的. 如何卸载 源码安装的软件? 在源码 的 解压目录下, 使用 make ...

  9. SpringBoot 统一异常处理

    统一异常处理: @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactor ...

  10. Linux/shell: remove adjacent similar patterns

    cat > temp004AA1abcAA2AA3abcAA4abcAA5AA6 awk 'BEGIN {pre=0; str="";} { if(NR==1){     i ...