• 找单身狗。一个数组中只有两个数字出现一次,其他数字出现了两次,编写一个函数找出这两个只出现一次的数字


    例:在{1 2 3 4 5 6 1 2 3 4}找出5和6

    方法二:

    设计思想:
        1.分组原理
        (1)将所有数字进行异或,相同数字异或为零,所以只会剩5^6,即为异或的结果xor_result
        (2)异或的结果xor_result按位与1,找出xor_result的二进制是从第几位开始有数字1
        (3)根据求出的1所在位置进行分组
         例如:{1,2,3,4,5,6,1,2,3,4}中,xor_result=3,二进制为011,那么可以从第0位或者第1位作为分组标准进行分组
         第0位:第一组:1,3,5,1,3    第二组:2,4,6,2,4
         第1位:第一组:2,3,6,2,3    第二组:1,4,5,1,4
        2.分组方式
        (1)将数组中的元素与xor_result相与,把相与为0和1的数字放在两个组中
        (2)对分别对两个组的元素再次异或,异或的结果就是只出现一次的数字
        即:假设按照第0位分组
         第一组:1^3^5^1^3=5
         第二组:2^4^6^2^4=6
        这样就能求出只出现一次的数字

    优点与不足:

    时间复杂度O(n),效率比方法一高

    只能算出存在两个只出现一次的数字

    方法一:

    设计思想:

        设计两层循环遍历数组中的每一个元素。

        在内层循环中再次遍历数组,检查是否存在与当前元素相等的其他元素。

        如果存在相同元素,跳出内层循环,返回外循环继续检查下一个元素。如果不存在,那么说明当前元素只出现了一次,打印该这个元素,并将标志位 flag 设置为1。

    优点与不足:

    数组中存在0个、1个或多个只出现一次的数字可以被找到/提示

    时间复杂度O(n^2)

    1. void find_dog(int arr[], int length)
    2. {
    3. int i = 0;
    4. int xor_result = 0;
    5. int tmp = 0;
    6. int num1 = 0;
    7. int num2 = 0;
    8. for ( i = 0; i < length; i++)
    9. {
    10. xor_result ^= arr[i];
    11. }
    12. for ( i = 0; i < 32; i++)
    13. {
    14. if (((xor_result >> i) & 1) == 1)
    15. {
    16. tmp = i;
    17. break;
    18. }
    19. }
    20. for ( i = 0; i < length; i++)
    21. {
    22. if (((arr[i] >> tmp) & 1) == 1)
    23. {
    24. num1 ^= arr[i];
    25. }
    26. else
    27. {
    28. num2 ^= arr[i];
    29. }
    30. }
    31. printf("%d %d", num1, num2);
    32. 方法一
    33. //int i = 0;
    34. //int j = 0;
    35. //int flag = 0;//判断是否存在只出现一次的情况,0不存在,1存在
    36. //for ( i = 0; i < length ; i++)
    37. //{
    38. // for ( j = 0; j < length; j++)
    39. // {
    40. //
    41. // if (i != j && arr[i] == arr[j])
    42. // break;
    43. // }
    44. // if (j == length)
    45. // {
    46. // flag = 1;
    47. // printf("%d\n", arr[i]);
    48. // }
    49. //}
    50. //if (0 == flag)
    51. //{
    52. // printf("不存在只出现一次的数字!\n");
    53. //}
    54. }
    55. int main()
    56. {
    57. int arr[] = { 1,2,3,4,5,6,1,2,3,4 };
    58. int length = sizeof(arr) / sizeof(arr[0]);
    59. find_dog(arr, length);
    60. return 0;
    61. }

  • 相关阅读:
    关于POI包处理excel方法详解 (一)
    数据结构-堆基本应用刷题
    基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(二)
    一、基本数据类型(数组)
    关于butterfly主题
    12.Bilinear Forms
    JOSEF约瑟 多档切换式漏电(剩余)继电器JHOK-ZBL1 30/100/300/500mA
    element ui多选框(Checkbox 多选框、Select多选框)编辑时无法选中的解决办法
    IJCAI2023【基于双曲空间探索的非独立同分布联邦学习】
    netty Recycler对象池
  • 原文地址:https://blog.csdn.net/m0_62014223/article/details/133217370