不爱生姜不吃醋⭐️⭐️⭐️
如果本文有什么错误的话欢迎在评论区中指正哦
看完之后觉得不错的话麻烦动动小手点个赞赞吧
与其明天开始,不如现在行动!
大家的支持就是我最大的动力!冲啊!
(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
来表示(例: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基础知识,其中关于异或的运算要多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家!!!