• 【剑指offer】找出数组中出现一次的两个数


    2013-09-08 10:50:46

    一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1)。

    小结:

    1. 任何数与0异或,结果仍为本身;
    2. 两个相同的数字异或,结果为0;
    3. 利用异或的以上两个特点,进行求解。

    代码(测试暂未发现问题,欢迎交流指正!):

     1 #include <iostream>
     2 #include <cassert>
     3 using namespace std;
     4 
     5 typedef int DataType;
     6 
     7 //返回一个数字的二进制表示中最低位的1的位置
     8 size_t GetNumberOfOnce(DataType number)
     9 {
    10     assert(number != 0);
    11 
    12     size_t mask =  1;
    13     size_t cnt = 0;
    14 
    15     while ( !(number & mask) )
    16     {
    17         ++cnt;
    18         number = number>>1;
    19     }
    20 
    21     return (cnt); 
    22 }
    23 
    24 //找出一个数组中仅出现一次的数字,通过pNumber1、pNumber2返回
    25 void GetNumberOfOnce(DataType *array,size_t len,DataType *pNumber1,DataType *pNumber2)
    26 {
    27     assert(array != NULL);
    28     assert(len >= 2);
    29 
    30     *pNumber1 = 0;
    31     *pNumber2 = 0;
    32     size_t index = 0;
    33     size_t resXOR = array[0];
    34 
    35     for (index = 1;index < len;++index)
    36     {
    37         resXOR ^= array[index];
    38     }
    39 
    40     size_t positionOf1 = GetNumberOfOnce(resXOR);
    41     size_t mask = 1 << positionOf1;
    42 
    43     for (index = 0;index < len;++index)   
    44     {
    45         if (array[index] & mask)   //任何数与0异或,结果仍为本身
    46         {
    47             *pNumber1 ^= array[index];
    48         }
    49         else
    50         {
    51             *pNumber2 ^= array[index];
    52         }
    53     }
    54 }
    55 
    56 //测试GetNumberOfOnce函数
    57 void TestGetNumberOfOnce()
    58 {
    59     DataType array[10] = {1,2,3,2, 3,5,6,7, 6,5};
    60     //DataType array[10] = {1, 6};
    61     size_t len = 10;
    62     DataType number1 = 0;
    63     DataType number2 = 0;
    64 
    65     GetNumberOfOnce(array,len,&number1,&number2);
    66     cout<<"the numbers appear once are : "<<number1<<"	"<<number2<<endl;
    67 }
    68 
    69 int main()
    70 {
    71     TestGetNumberOfOnce();
    72     return 0;
    73 }

    测试结果:

    the numbers appear once are : 7 1
    请按任意键继续. . .
  • 相关阅读:
    人工智能芯片支持超低功耗器件的推理
    新十年嵌入式音频的五大趋势
    面向汽车应用的硬件推理芯片
    MySQL优化技巧总结
    JAVA集合类汇总
    为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?
    ztree 树状图——例
    amazeUI表单提交验证--input框required
    bigcolorpicker 颜色拾取器插件——例
    博客园-去掉皮肤
  • 原文地址:https://www.cnblogs.com/youngforever/p/3308147.html
Copyright © 2020-2023  润新知