公众号平台入口,东莞网站设计知名乐云seo,陕西城乡住房建设厅网站,建网站系统不爱生姜不吃醋⭐️⭐️⭐️ #x1f33b;如果本文有什么错误的话欢迎在评论区中指正哦#x1f497; #x1f33b;看完之后觉得不错的话麻烦动动小手点个赞赞吧#x1f44d; #x1f33b;与其明天开始#xff0c;不如现在行动#xff01;#x1f4aa; #x1f33b;大家… 不爱生姜不吃醋⭐️⭐️⭐️ 如果本文有什么错误的话欢迎在评论区中指正哦 看完之后觉得不错的话麻烦动动小手点个赞赞吧 与其明天开始不如现在行动 大家的支持就是我最大的动力冲啊 文章目录 面试题分析代码编写第一问第二问 总结 面试题 (1)在一个数组中有一个数出现了奇数次其余数都出现了偶数次,求出这个数 (2)如果数组中有两个数出现了奇数次求这两个数 分析
这是一道经典的关于位运算的面试题使用异或^来解题。 异或相当于是不进位的二进制加法其相关运算 1 ^ 1 0 1 ^ 0 1 0 ^ 0 0 除此之外异或运算的两个性质交换律和结合律 a ^ b b ^ a a ^ b ^ c a ^ c ^ b 了解相关概念之后对于面试题的第一问 把数组中的所有数字异或运算相同的两个数字异或之后会等于0那么再与剩余的奇数个的数字异或就会等于我们要的这个数字 对于第二问我们分成三部分来解决 假如数组中奇数个的数字分别是a和b那么按照第一问的方法异或数组中的所有数字最后的得到的结果就是a^b用num1来表示 之后我们求出num1的二进制中只保留最右边的1的数用num2来表示例num11010,那么num20010下面的分析也是以这两个数来说明让num2来异或所有在二进制数中第二位不等于1的数例x0010,y1100,那么就要用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 num0;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);}
}运行代码之后我们得到数字25。 总结
文章中代码的编写使用的都是Java基础知识其中关于异或的运算要多加练习熟能生巧。 本文中若是有出现的错误请在评论区或者私信指出我再进行改正优化如果文章对你有所帮助请给博主一个宝贵的三连感谢大家