c++数据结构与算法题目快速找出机器故障



c++数据结构与算法题目快速找出机器故障。

题目来自编程之美

题目 1:假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据。其中ID是小于10亿的整数,在某个时间,如果得到一个数据文件ID的列表。是否能够快速的找到这个表中仅出现一次的ID?即快速找出出现故障的机器存储的数据ID。

分析:具体参考点击打开链接

代码

 

[cpp] view plaincopy


  1. #include <iostream>
  2. #include <assert.h>
  3. using namespace std;
  4. /*函数nArr中的只有一个元素出现一次,其他元素都是出现两次*/
  5. int Find(int nArr[],int nLen)
  6. {
  7.     assert(nArr != NULL && nLen > 0 && nLen % 2 == 1);
  8.     int nNum = 0;
  9.     for (int i = 0;i < nLen;i++)
  10.     {
  11.         nNum ^= nArr[i];
  12.     }
  13.     return nNum;
  14. }
  15. int main()
  16. {
  17.     int nArr[9];
  18.     for (int i = 0;i < 9;i++)
  19.     {
  20.         cin>>nArr[i];
  21.     }
  22.     cout<<Find(nArr,9)<<endl;
  23.     system(“pause”);
  24.     return 1;

题目 2: 假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据。其中ID是小于10亿的整数,如果有两台机器死机呢?(假设同一个数据的俩个备份不会同时丢失,即列表中缺少的是两个不等的ID)

 

分析:具体参考点击打开链接

代码:

  1. #include <iostream>
  2. #include <assert.h>
  3. using namespace std;
  4. int FindLastOne(int nNum)
  5. {
  6.     assert(nNum > 0);
  7.     int nPos = 1;
  8.     int nLast = nNum & 1;
  9.     while (0 == nLast)
  10.     {
  11.         nPos++;
  12.         nNum >>= 1;
  13.         nLast = nNum & 1;
  14.     }
  15.     return nPos;
  16. }
  17. /*判断nNum的nPos位置上是否为1*/
  18. bool IsSameBit(int nNum,int nPos)
  19. {
  20.     assert(nPos >= 0);
  21.     return nNum & (1 << (nPos - 1)) ? true : false;
  22. }
  23. /*函数nArr中有两个元素都出现一次,其他元素都是出现两次*/
  24. void Find(int nArr[],int nLen)
  25. {
  26.     assert(nArr != NULL && nLen > 0);
  27.     int nNum = 0;
  28.     int nPos = 0;
  29.     int nNumFirst = 0;
  30.     int nNumSec = 0;
  31.     //首先把所有元素都异或一遍
  32.     for (int i = 0;i < nLen;i++)
  33.     {
  34.         nNum ^= nArr[i];
  35.     }
  36.     /*根据最后异或的结果中1的位置,把数据分两组,并分别在每组进行异或*/
  37.     nPos = FindLastOne(nNum);
  38.     for (int i = 0;i < nLen;i++)
  39.     {
  40.         if (IsSameBit(nArr[i],nPos)) //nArr[i]在nPos位置为1
  41.         {
  42.             nNumFirst ^= nArr[i];
  43.         }
  44.         else  //nArr[i]在nPos位置为0
  45.         {
  46.             nNumSec ^= nArr[i];
  47.         }
  48.     }
  49.     cout<<”Losing Num: ”<<nNumFirst<<” ”<<nNumSec<<endl;
  50. }
  51. int main()
  52. {
  53.     int nArr[8] = {1,2,3,1,2,4,5,4};
  54.     Find(nArr,8);
  55.     system(“pause”);
  56.     return 1;
  57. }