- 问题: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明: - 要求:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
- 示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4 - java解答:
Java hashMap相关
@Test
public void test01(){
int[] arr1 = {1,2,3,2,3};
aa = null;
Map<Integer,Integer> map = new HashMap<>();
//通过hashMap的key存储数组的值,value存储该字出现的次数
for(int i = 0; i< arr1.length;i++){
if(map.get(arr1[i]) == null){
map.put(arr1[i],1);
}else if(map.get(arr1[i]) == 1){
map.put(arr1[i],2);
}
}
for(Map.Entry<Integer,Integer>str : map.entrySet() ){
if(str.getValue() == 1){
aa = str.getKey();
}
}
System.out.println(aa);
}
位运算解决
异或运算法则:
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
4. a ^ b ^ a = b.
运算有交换率特性
@Test
public void test02(){
//相同的数字异或为0,和0的异或是自己本身;
int[] aa = {1,2,2,3,3};
int result = 0;
for(int i = 0; i < aa.length;i++){
aa = 0^aa[i];
}
System.out.println(aa);
}
如果不好理解的话可以运行下面的代码:
System.out.println(4^1^2^1^2);