找数组中只出现一次的元素--位运算

题1:99个数,里面只有一个数出现了一次,其他均出现了两次;如何最快找到这个数,假设为一个int数组里,数大小没有限制

特点:数值范围不确定;仅有一个数单词出现;

// 运用位操作,异或所有元素;
#include "stdafx.h"
#include <stdlib.h>
#define COUNT 9

void main (void )
{
    int numbers[COUNT] = {1, 3, 6, 122, 23, 23, 3, 6, 122};  // 9个随机数
    int temp = 0;

    for ( int i = 0; i < COUNT; i++)  
    {
        temp ^= numbers[i];                 //异或,奇数个自己异或,为自己;
    }
    printf("find %d\n", temp );
}

只用了9个数运算,偷懒一下下~~

题2:找出数组中只出现一次的两个数

解题方法跟上一题类似,异或后再分组:
1、所有元素整体异或,排除相同值,找到只出现一次的两个数,即a ^ b = c;
2、根据异或特征,不同 则置位 为1;若c 为 00101100 找到最右边的第一个位 1,其他位置0,c 变换为00000100;
3、所有元素与 00000100 进行“&”运算,实现分组;
4、各组再整体异或值,清除相同值,剩下即为 a 或 b的值;

#include "stdafx.h"
#define MAX 10

int main()
{
    int ar[MAX] = {2, 34, 10,5, 123,6, 5, 123,2, 34};
    int a = 0, b = 0, c = 0, temp = 0;

    for (int i = 0; i < MAX; i++)
    {
        c ^= ar[i] ;//即为a^b
    }

    //找到最右边的第一个1(不相同的位)
    temp = c & (-c);

    //按位分组
    for (int i = 0; i < MAX; i++)
    {
        if (ar[i] & temp)
        {
            a ^= ar[i];
            printf("ar1 = %d\n", ar[i]);
        }
        else
        {
            b ^= ar[i];
            printf("ar0 = %d\n", ar[i]);
        }
    }
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值