面试题40—数组只出现一次的数字

**题目:一个数组除了两个数字以外,其余的都出现了两次,请找出这两个数字。
代码示例:**

#include<iostream>
using namespace std;
int FindFirst_1_FromRight(int n)//找一个数字的二进制最右边为1的序号,其中n不为零
{
    int flag = 1;
    int index = 1;
    while (!(n&flag))
    {
        flag <<=1;
        index++;
    }
    return index;
}
bool Is_1_NthFromRight(int num,int n)//判断一个数的二进制从最右边开始第n位是不是1
{
    int flag = 1;
    flag = flag << (n - 1);
    if (num&flag)
        return true;
    else
        return false;
}
int Left1_Right0(int a[], int n)//数组中元素的二进制第index位为1的位于左边,为0的位于右边,从而将数组分为两半
{
    int temp = 0;
    for (int i = 0; i < n; i++)
    {
        temp = temp^a[i];
    }
    int index = FindFirst_1_FromRight(temp);

    int begin = 0;
    int end = n - 1;
    while (begin <end)
    {
        if (Is_1_NthFromRight(a[begin], index))
        {
            begin++;
        }
        else
        {
            if (Is_1_NthFromRight(a[end], index))
            {
                int temp = a[begin];
                a[begin] = a[end];
                a[end] = temp;
                begin++;
                end--;
            }
            else
            {
                end--;
            }
        }
    }
    return begin-1;
}


int main()
{

    const int n =4;
    int a[n] = { 1, 2,6,6};
    int spilt_point = Left1_Right0(a, n);

    int temp1 = 0;
    int temp2 = 0;
    for (int i =0; i <= spilt_point; i++)
        temp1 = temp1^a[i];
    for (int i = spilt_point + 1; i < n; i++)
        temp2 = temp2^a[i];

    cout << "原数组为:";
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;

    cout << "不同的两个数为:" << temp1 << " " << temp2 << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值