Java经典面试题(异或运算)

不爱生姜不吃醋⭐️⭐️⭐️

如果本文有什么错误的话欢迎在评论区中指正哦
看完之后觉得不错的话麻烦动动小手点个赞赞吧
与其明天开始,不如现在行动!
大家的支持就是我最大的动力!冲啊!

文章目录

  • 面试题
  • 分析
  • 代码编写
    • 第一问
    • 第二问
  • 总结


面试题

(1)在一个数组中,有一个数出现了奇数次,其余数都出现了偶数次,求出这个数
(2)如果数组中有两个数出现了奇数次,求这两个数


分析

这是一道经典的关于位运算的面试题,使用异或^来解题。
异或相当于是不进位的二进制加法,其相关运算:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0

除此之外,异或运算的两个性质:交换律和结合律

a ^ b = b ^ a
a ^ b ^ c = a ^ c ^ b

了解相关概念之后,对于面试题的第一问:

把数组中的所有数字异或运算,相同的两个数字异或之后会等于0,那么再与剩余的奇数个的数字异或就会等于我们要的这个数字

对于第二问,我们分成三部分来解决:

假如数组中奇数个的数字分别是ab,那么按照第一问的方法,异或数组中的所有数字,最后的得到的结果就是a^b,用num1来表示

之后我们求出num1的二进制中只保留最右边的1的数,用num2来表示(例:num1=1010,那么num2=0010,下面的分析也是以这两个数来说明),让num2来异或所有在二进制数中第二位不等于1的数(例:x=0010,y=1100,那么就要用num2异或y)最终会得到a和b这俩个数其中的一个

假设我们得到了a,那么只需要用a异或num1就会得到b

多说无益,那我们就开始编写代码吧!

代码编写

第一问

public class Test2 {
    public static void main(String[] args) {
        //定义数组,其中2出现了三次,其余数字都出现了偶数次
        int[] arr = {1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5};

        int num=0;
        for (int i : arr) {
            num ^= i;
        }
        System.out.println(num);
    }
}

运行代码之后我们得到数字2

第二问

public class Test {
    public static void main(String[] args) {
        //定义数组,其中2出现了三次,5出现了一次,其余数字都出现了偶数次
        int[] arr = {1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5};

        int num1 = 0;
        for (int i : arr) {
            num1 ^= i;
        }

        int rightOne = num1 & (~num1 + 1);
        int num2 = 0;
        for (int i : arr) {
            if ((rightOne & i) == 0) {
                num2 ^= i;
            }
        }

        int a = num2;
        int b = a ^ num1;

        System.out.println(a + "," + b);
    }
}

运行代码之后我们得到数字2,5


总结

文章中代码的编写使用的都是Java基础知识,其中关于异或的运算要多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家!!!


你可能感兴趣的:(Java基础案例,java,开发语言,异或运算)