找出只出现一次的两个数字

题目

一个整形数组里,除了两个数字之外,其他的数字都出现了两次,找出这两个只出现一次的数字,例如数组{1,3,5,7,1,3,5,9},找出7和9。

理解

之前做过一个数组中只有一个只出现一次的数字,用亦或的方法,同理,找两个数字,先把所有数字亦或,最后的结果是两个只出现一次的数亦或的结果,这个结果中,出现1的位置说明两个元素当前位不相等,可以根据1出现的位置把当前数组分为两个子数组,每个子数组中只有一个出现一次的数字,其余元素都是两两出现,然后对每个字数组单独亦或,求出两个单独的数。

代码

public class lianxi {
    public static void fin(int []a) {
        int x=0;
        int pos=0;
        int s1=0;
        int s2=0;
       for(int i=0;i<a.length;i++){
           x^=a[i];//两个出现一次的数亦或的结果
       }
       for(int i=0;i<32;i++){
           if(((x>>i)^1)==0)
           {
               pos=i;//找出亦或结果中第一次出现1的位置,根据pos上的数字的不同,可分为两个子数组
               break;
           }
       }
       for(int i=0;i<a.length;i++){
           if(((a[i]>>pos)&1)==0){
               s1^=a[i];
           }
           else
               s2^=a[i];
       }
       System.out.println(s1+" "+s2);
        }
        public static void main(String[]args){
        int []a={1,3,5,7,1,3,5,9};
            fin(a);
            }
       }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值