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


    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;
    }
  • 相关阅读:
    json基础
    css语法以及css选择器
    HTML语义化标签
    CSS插入的四种方式
    Hibernate主键生成策略及选择
    HIbernate处理数据更新丢失
    数据库的四大特性以及事务的隔离级别
    MD5加密
    redis主从复制
    redis的持久化方案
  • 原文地址:https://www.cnblogs.com/dplearning/p/3912740.html
Copyright © 2020-2023  润新知