剑指offer 数组中只出现一次的数字

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

题目分析

这种题目一般使用位运算来计算。
显然这个题目与使用异或运算寻找一个单独数字有异曲同工之妙,只不过这次取异或之后,我们得到的是一个分组标志flag,num&flag=1一组,num&flag=0一组,两组各包含一个单独数字。

java代码

public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int[] num11 = new int[array.length];
        int[] num22 = new int[array.length];
        int temp = 0;
        for(int i=0;i<array.length;i++){
            temp ^= array[i];
        }
        System.out.println("temp = " + temp);
        int flag = 1;
        while(true){
            int x = temp&flag;
            System.out.println(x);
            if(x==0){
                flag<<=1;
            }else{
                break;
            }
        }
        System.out.println("flag = " + flag);
        int num1Index = 1;
        int num2Index = 1;
        for(int i=0;i<array.length;i++){
            int x = flag&array[i];
            if(x==0){
                num11[num1Index++] = array[i];
            }else{
                num22[num2Index++] = array[i];
            }
        }
        num1[0] = 0;
        num2[0] = 0;
        for(int i=1;i<num1Index;i++){
            num1[0] ^= num11[i];
        }
        for(int i=1;i<num2Index;i++){
            num2[0] ^= num22[i];
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值