zoukankan      html  css  js  c++  java
  • 【编程题目】找出数组中两个只出现一次的数字 ★★(自己没做出来)

    61.找出数组中两个只出现一次的数字(数组)
    题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
    请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n),空间复杂度是 O(1)。

    思路:瞄到了一眼提示,说是位运算。

    根据异或的运算性质: a ⊕ b ⊕ a = b

    把所有的数字都异或一遍得到的结果就是 那两个只出现一次的数字异或的结果。 可怎么分出那两个数字就卡住了。

    看了下网上答案,要根据得到的异或值把数字分为两组,再对每一组异或就可以得到这两个数字了! 

    代码如下:

    /*
    61.找出数组中两个只出现一次的数字(数组)
    题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
    请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n),空间复杂度是 O(1)。
    */
    #include <stdio.h>
    void find2(int * a, int len)
    {
        int xor = 0;
        for (int i = 0; i < len; i++)
        {
            xor = xor ^ a[i];
        }
    
        int b = 0;
        while (((xor>>b) & 1) != 1)
        {
            b++;
        }
    
        int n1 = 0, n2 = 0;
        for (int i = 0; i < len; i++)
        {
            if (((a[i] >> b) & 1) == 1)
            {
                n1 ^= a[i];
            }
            else
            {
                n2 ^= a[i];
            }
        }
    
        printf("the two numbers are %d and %d", n1, n2);
    }
    
    int main()
    {
        int a[8] = {1, 2, 3, 4, 5, 5, 3, 2};
        find2(a, 8);
        return 0;
    }
  • 相关阅读:
    vue中$route和$router的区别
    vscode
    好用的天气插件
    jQuery的slideUp和slideDown函数
    在CSS/JS之后开发工作人员经常会考虑的性能优化。从用户刷新页面,一次js请求下有哪些地方需要缓存
    前端与BI
    XSS和CSRF区别
    兼容性问题
    div跟随鼠标移动
    匀速运动
  • 原文地址:https://www.cnblogs.com/dplearning/p/3912740.html
Copyright © 2011-2022 走看看