• 寻找单身狗


    在一个数组中仅出现一次,其他数均出现两次,这个出现一次的数就被称为“单身狗“。

    一.一个单身狗

    我们知道异或运算操作符 ^ ,它的特点是对应二进制位相同为 0,相异为 1

    由此我们容易知道两个相同的数,进行异或运算得到的结果一定为 0,0和非0数字异或的结果为非0数字,因此我们可以将数组中的所有元素都进行异或,出现过两次的数异或结果将为0,留下来的就是单身狗了。

    代码实现:

    1. int FindSingle(int* arr,int sz)
    2. {
    3. int dog = 0;
    4. int i = 0;
    5. for (i = 0; i < sz; i++)
    6. {
    7. dog ^= arr[i];
    8. }
    9. return dog;
    10. }
    11. int main()
    12. {
    13. int arr[5] = { 1,4,2,1,2 };
    14. int sz = sizeof(arr) / sizeof(arr[0]);
    15. printf("单身狗为:%d\n", FindSingle(arr, sz));
    16. return 0;
    17. }

    二.两个单身狗

    如果数列中存在两个单身狗,依然和上面一样全部进行异或运算显然是得不到答案的,相同的数通过异或消除了,得到的会是两个单身狗异或的结果。

    能不能将两个单身狗分开,在两个数组中分别以上面的方式找出单身狗呢?

    异或的条件是对应二进制位相同为 0,相异为 1。通过两个单身狗数异或的结果,我们可以得到两个单身狗数在某些二进制位上单身狗的值不同(0或1),可以通过这位上的值不同来将两个单身狗分开。

    同样,对于出现过两次的非单身狗数,也可以通过判断某一二进制位相同,将其放入同一数组中,再对该数组进行异或运算后消除。

    代码实现:

    1. void FindSingle(int* arr, int sz,int* dog,int* dog1,int* dog2)
    2. {
    3. int i = 0;
    4. for (i = 0; i < sz; i++)
    5. {
    6. //全部异或得到两个单身狗的异或结果
    7. *dog ^= arr[i];
    8. }
    9. //两个单身狗数某二进制位上的值不同
    10. int pos = 0;
    11. for (i = 0; i < 4; i++)
    12. {
    13. //dog的值为两个单身狗数异或的结果,dog的某一二进制位为1则代表两个单身狗在这一二进制位上不相等
    14. //找出这一位置并拷贝下来
    15. if (((*dog >> i) & 1) == 1)
    16. {
    17. pos = i;
    18. break;
    19. }
    20. }
    21. //将数组按pos位上的值为1或0分组并求异或
    22. for (i = 0; i < sz; i++)
    23. {
    24. if (((arr[i] >> pos) & 1) == 1)
    25. {
    26. *dog1 ^= arr[i];
    27. }
    28. else
    29. {
    30. *dog2 ^= arr[i];
    31. }
    32. }
    33. }
    34. int main()
    35. {
    36. int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };
    37. int dog = 0;
    38. int dog1 = 0;
    39. int dog2 = 0;
    40. int sz = sizeof(arr) / sizeof(arr[0]);
    41. FindSingle(arr, sz, &dog, &dog1, &dog2);
    42. printf("单身狗1是:%d,单身狗2是:%d", dog1, dog2);
    43. return 0;
    44. }

  • 相关阅读:
    Spring整合Mybatis
    SpringCloud 集成Sentinel
    后端SpringBoot+前端Vue前后端分离的项目(一)
    七天接手react项目 系列 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法
    百度搜索智能化算力调控分配方法
    ESP32集成开发环境Espressif-IDE安装 – Windows
    公共经济学考试题库完整
    echarts中地图使用的地图数据格式GeoJSON
    【计算机网络】ip协议
    多线程05:unique_lock详解
  • 原文地址:https://blog.csdn.net/dn235z/article/details/133170349