数组arr中,有一个数k出现了奇数次,其他数出现偶数次,请找到并打印这个数k

数组arr中,有一个数k出现了奇数次,其他数出现偶数次,请找到并打印这个数k

提示:异或运算重要知识点系列文章
只要了解异或运算的根本知识点,解决这些问题也就不在话下。

(1)认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关


题目

数组arr中,有一个数k出现了奇数次,其他数出现偶数次,请找到并打印这个数k


一、审题

示例:arr=1 2 3 4 5 3 5 4 2
k=1它出现了1次,奇数次
其余数他们都出现了2次,偶数次
请你快速找到k=1,并打印出来


二、解题

暴力解:

用哈希表统计每一个数字出现的频次呗,这还不简单
map:key代表arr中每一类数字,value代表数字出现的频率
然后找哪个key的value它是1,打印这个key完事
在这里插入图片描述
那么o(n)复杂度,你还要额外的空间来存这些数字们,这是不好的做法

异或运算最优解

这个题,既然是涉及数字的频次,还有出现的奇数次,偶数次这种字眼
当初我们学异或运算的时候,提到过
异或运算是不分顺序的,有结合律分配律!
一个数x,有奇数次异或,还是它自己x
在这里插入图片描述
一个数,有偶数次异或,异或完了是0
在这里插入图片描述
显然,本题要求得就是哪个数,它出现了奇数次
不管1 3 5 7 9 万一出现了很多,但是也是奇数次呢?
那就可以用异或来求:
(1)令eor=0;
(2)整个数组arr遍历一遍,令所有位置的数字都跟eor异或,在此过程中,不管顺序如何,相同的数字两个一见面,就异或为0了
(3)遍历完数组,则,偶数次那些数字异或没了,唯一一个异或还能留下的必然是奇数次出现那个k
看图就和明白了,咱们利用的就是:异或的本质及规律【本文开头那,系列文章(1)必须学会,很经典的知识】
在这里插入图片描述

手撕代码:

//arr中有一种数字,它出现过奇数次,怎么找到并打印该数字
    public static void printOddNum(){
        int[] arr = {1,1,1,1,2,2,2,3,3,3,3};//2就出现了奇数次
        //方法很简单,就是用异或的性质:N^0=N,N^N=0
        // 说明1次【奇数次】异或完还是自己,2次【偶数次】异或完为0
        int eor = 0;//0不影响异或的结果
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        System.out.println(eor);
    }

总结

提示:重要经验:

1)本文开头的认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关!必学会
2)与数字出现的次数为奇数次,偶数次类似的字眼,敏感度必须高,想到异或运算!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值