【剑指】50,数组中只出现一次的数字

比眉伴天荒 2023-07-12 14:19 72阅读 0赞

题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
这个题目是之前的数组中只出现一次的的一个数字的变形。重点在于我们要将这两个数字分开在两个不同的堆。所以,思路形成了:这两个数字一定不一样。所以我们将所有的数字先一起异或。的出来的结果就是实际的那两个数字的异或结果。然后我们通过提取里面的数字的某一个为1的位来实现将数组分为两堆。然后我们通过对两堆分别异或,最后的出来的结果就为这两个数字。
代码:

  1. class Solution {
  2. public:
  3. void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
  4. int n=data.size();
  5. if(n==0) return ;
  6. if(n<2) return;
  7. *num1=0;
  8. *num2=0;
  9. int xorres=0;
  10. for(int i=0; i<n;)
  11. {
  12. xorres^=data[i++];
  13. }
  14. int andres=0;
  15. int movebit=0; //位从0开始
  16. while(andres!=1) //找到xorres第一个为1的位。
  17. {
  18. andres= xorres & 1;
  19. if(andres!=1)
  20. { xorres= xorres>>1;
  21. movebit++;
  22. }
  23. }
  24. int mark=1<<movebit;
  25. for(int i=0;i<n;i++)
  26. {
  27. if(data[i]& mark)
  28. *num1^=data[i];
  29. else
  30. *num2^=data[i];
  31. }
  32. return ;
  33. }
  34. };

发表评论

表情:
评论列表 (有 0 条评论,72人围观)

还没有评论,来说两句吧...

相关阅读