1.一个数组只有一个数出现奇数次其它都出现偶数次
用异或解决
public class EvenTimesOddTimes {
public static void main(String[] args) {
int[] arr = {1,2,2,3,2,3,2,1,3};
printOddTimesNum1(arr);
}
public static void printOddTimesNum1(int[] arr) {
int eor = 0;
for (int i : arr) {
eor ^= i;
}
System.out.println(eor);
}
}
这样的话时间复杂度为O(n)
同样用hashmap也可以
public static void printOneNum(int[] arr) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int cur : arr) {
map.put(cur,map.getOrDefault(cur,0)+1);
}
map.forEach((k,v) -> {
if (v%2!=0) {
System.out.println(k);
}
});
}
2.一个数组有两个数出现奇数次其它都出现偶数次
用位运算
//含有两个奇数
public static void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int cur : arr) {
eor ^= cur;
}
//eor = a^b
//eor != 0
//eor必有一位含有1
int rightOne = rOneNum(eor); //提取最右侧的1
int onlyOne = 0; //eor'
for (int cur : arr) {
if (rOneNum((cur & rightOne))==rightOne)
onlyOne ^= cur;
}
System.out.println(onlyOne+" "+(eor ^ onlyOne));
}
//该函数求最右边的1
public static int rOneNum(int num) {
return num & (~num + 1);
}```
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e608c5b8cf44298bda7b069ac6bfb56.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDYyOTA1NA==,size_16,color_FFFFFF,t_70)
记录一下 左神还是牛逼的