//找到数组中,出现了奇数次的数并打印

package Find;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-20--15:07
 */
public class fin {   //找到数组中,出现了奇数次的数并打印

    //不需要排序,直接异或,因为异或的结果和顺序无关
    //目标需要寻找的也是次数,异或出来的就是剩下的那一个


    //题目1:
    //arr中,只有一种数出现奇数次
    //偶数次的,异或出来都是0;最后只剩奇数次的那一次
    public static void printOddTimesNum1(int[] arr){
        int eor=0;
        for (int i=0;i<arr.length;i++){
            eor^=arr[i];   //eor=eor^arr[i],eor会随着i一直把数组中的数向后遍历,直到把数组中所有的数都遍历完
            System.out.println(eor);
        }
    }

    //题目2:
    //arr中,只有两种数出现奇数次
    //偶数次的,异或出来都是0;
    public static void printOddTimesNum2(int[] arr){
        /*
        偶数次仍然不干扰,剩下的奇数次只有a,b
         */
        int ero=0;
        for (int i=0;i<arr.length;i++){
            ero^=arr[i];  //找到了a、b
        }
        //此时的ero中必然有一个位置是1
        //010101110
        //000000010  rightOne
        int rightOne=ero&(~ero+1); //提取出最右边的1
        int onlyOne=0;  //onlyOne  ero'
        for (int i=0;i<arr.length;i++){
            //     arr[1]=00001110101
            //   rightOne=00000010000
            if ((arr[i]&rightOne)!=0){   //代表010100010处有1  ,把最右位是0还是1分开
                onlyOne^=arr[i];
            }
        }
        System.out.println(onlyOne+" "+(ero^onlyOne));  //onlyOne是a,ero^onlyOne是b
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值