zoukankan      html  css  js  c++  java
  • 确定只出现曾有两位数字数组

    称号:除了外面两个数字为整数数组。其他人物都出现两次。

    请敲代码,找了两个数字只出现一次。它需要的时间复杂度O(n),空间复杂度是O(1)。

    或深足够的认识。
    要思路还是之前的数组中仅仅出现一次的数字的那种模式,一次遍历加上异或运算。那么这个异或的值肯定是这两个仅仅出现一次的数字的相异或的值。那么这个值的二进制表现形式中的1的结果就表示这两个数字在该bit位上不一样。那么通过此举,我们能够以这个bit位是否为1来从整个数组中把这两个仅仅出现一次的数字分开。

    通过此举。别的出现两次的数字一会被分到同一组,那么结果就是有两组数据。每组都是奇数个数字。都有仅仅出现一次的数字。

    #include<stdio.h>
    #include<assert.h>
    int findOutTwo(int *a,int n,int &x,int &y){
        assert(a);
        assert(n>2);
        int result=a[0];
        for(int i=1;i<n;++i)
            result^=a[i];
        int b=result&-result;
        x=0;
        y=0;
        for(int i=0;i<n;++i)
        {
            if(b&a[i])
                x^=a[i];
            else
                y^=a[i];
        }
        return 0;
    }
    int main()
    {
        int a[]={1,1,2,2,3,3,4,4,5,6};
        int x,y;
        findOutTwo(a,sizeof(a)/sizeof(int),x,y);
        printf("%d %d
    ",x,y);
        getchar();
        return 0;
    }

    结果为:
    这里写图片描写叙述

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    2018年第九届蓝桥杯【C++省赛B组】第二题 明码
    2018年第九届蓝桥杯【C++省赛B组】第三题 乘积尾零
    2018年第九届蓝桥杯【C++省赛B组】第四题 测试次数
    L2-023 图着色问题
    L2-011 玩转二叉树
    获取当前的时间,转化为char[]格式unix时间戳
    创建子进程
    strerror
    gdb
    gcc
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4667321.html
Copyright © 2011-2022 走看看