32-有两个单独的数字,其它数字成对,请输出这两个单独的数字

深碍√TFBOYSˉ_ 2022-12-22 04:57 89阅读 0赞

解题代码

  1. #include<stdio.h>
  2. //得到tmp二进制右数第一个1的值!!!
  3. //100->4; 10101->1; 1010->2
  4. int GetBit(int tmp)
  5. {
  6. int i = 1;
  7. for(int j=0;j<32;j++)
  8. {
  9. if((tmp & i) != 0)
  10. {
  11. break;
  12. }
  13. i <<= 1;
  14. }
  15. return i;
  16. }
  17. //有两个单独的数字,其它数字成对,请输出这两个单独的数字
  18. //分组:1.将两个单独数字分在不同组,2.相同数字一定在同一组
  19. //分组的办法:异或的结果的二进制右数第一个1作为分组依据
  20. //右数的第一个1,说明这2个单独出现的数字在这个位上出现了不同,我们就可以分开了!
  21. void Num2(int *arr,int len)//O(n),O(1)
  22. {
  23. int tmp = 0;
  24. int x1 = 0; //第一个单独的数字
  25. int x2 = 0;//第二个单独的数字
  26. int flg = 0;//分组依据
  27. for(int i=0;i<len;i++)//计算异或的值
  28. {
  29. tmp ^= arr[i];
  30. }
  31. //得到tmp二进制右数第一个1的值
  32. flg = GetBit(tmp);
  33. for(int i=0;i<len;i++)
  34. {
  35. if((arr[i]&flg) == 0) //分为两组数据,分别^
  36. {
  37. x1 ^= arr[i];
  38. }
  39. else
  40. {
  41. x2 ^= arr[i];
  42. }
  43. }
  44. printf("%d,%d\n",x1,x2);
  45. }
  46. int main()
  47. {
  48. int arr[] = {
  49. 1,2,3,4,2,1,4,7};
  50. Num2(arr,sizeof(arr)/sizeof(arr[0]));
  51. return 0;
  52. }

发表评论

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

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

相关阅读