【案例一】其余元素出现过两次——使用异或
- 异或:两个相同数的异或结果为0(其二进制会进行异或);
- 异或满足交换律和结合律。
eg:[2,3,2]交换律
三个数异或:010 ^ 011^010 = 010 ^ 010 ^ 011 = 0 ^ 011 = 011——得出3
【面试题】给定一个非空整数数组,其中只有一个元素出现一次,其他元素均出现两次,找出那个只出现一次的元素
public class Main{
public static void main(String[] args){
int[] arr = {2,2,5,4,1,1,5,7,7};
int once = 0;
for(int i=0;i<arr.length;i++){
once = once ^ arr[i];
}
System.out.println(once);
}
}
——得出结果为:4
【案例二】其余元素出现过多次
如果是其它数字出现多次,就一个数字出现一次,找出该数字,则可以用HashMap来做:
import java.util.*;
public class Main1{
public static void main(String[] args){
int[] arr = {2,2,5,4,1,1,5,7,5,7};
Map<Integer,Integer> map = new HashMap<>();
//数组元素为key,出现次数为value
for(int i=0;i<arr.length;i++){
if(map.get(arr[i]) == null){
map.put(arr[i],1);
}else if(map.get(arr[i]) == 1){
//该数组元素已经出现过,则再次加入,使得value为2
map.put(arr[i],2);
}
}
int res = 0;
for(Map.Entry<Integer,Integer> num : map.entrySet()){
if(num.getValue() == 1){
res = num.getKey();
}
}
System.out.println(res);
}
}
【案例三】消失的数字
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例1:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
class Solution {
public int missingNumber(int[] nums) {
int res = 0;
for(int i=0;i<nums.length;i++){
res = res ^ i;
res = res ^ nums[i];
}
res = res ^ nums.length;
return res;
}
}