简述:给出一个数组array,其中除了一个数字是只出现一次,其他的数字都是出现两次,例如:
int[] array = {1,2,2,3,3,4,4,5,5,6,6}
找出只出现一次的数字
集合处理
创建一个结合set,遍历数组,当集合中没有当前数字时add进去,当存在该数字时则remove,最后就只剩下只出现了一次的数字了
/**
* 通过集合找出只出现一次的数字
* */
public static int findOneNuForSet(int[] array) {
Set<Integer> set = new HashSet<>();
for (int i : array) {
if (set.contains(i)){
set.remove(i);
}else {
set.add(i);
}
}
return set.toArray(new Integer[0])[0];
}
该方法虽然可以实现,但一个数组的问题,又牵涉上了hashset(java中用的hash结构),似乎并不是很完美,别急,我们试一下用位运算的方法处理
异或处理
异或的运算规则是:
1、0 ^ a=a;
2、0 ^ 0=0;
3、a ^ a=0;
4、a ^ b ^ a = b
由此,我们可以这样
/**
* 异或的方式处理
* */
public static int findOneNum(int[] array) {
int tmp = 0;
for (int i : array) {
tmp ^= i;
}
return tmp;
}