找出数组只出现一次的数字
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例:
输入: [-1,-5,3,1,-5]输出: 3
思路1:map集合解法
用map集合来处理,把数组的元素作为key,然后出现的次数为value,遍历数组,然后再遍历整个map集合,找出value为1的关键字。
代码:
public class singleNumber {
public static void main(String[] args) {
int[] data = new int[]{1, -5, 3, 1, -5};
System.out.println(singleNumber(data));
}
/**
* map集合解法
* 把数组的元素作为key,然后出现的次数为value,遍历数组,然后再遍历整个map集合,找出value为1的关键字
* @param nums
* @return
*/
public static int mapSolution(int[] nums) {
int num = 0;
Map map = new HashMap();//遍历该数组,往map集合里存,数组元素为key,出现次数为valuefor(int i = 0;i if (map.get(nums[i]) == null) {
map.put(nums[i], 1);
} else if (map.get(nums[i]) == 1) {
map.put(nums[i], 2);
}
}//找出map集合里value为1的元素for (Map.Entry str : map.entrySet()) {if (str.getValue() == 1) {
num = str.getKey();
}
}return num;
}
}
思路2:异或解法(推荐使用)
因为数组中除了一个元素只出现一次之外,其它的元素都出现两次,如果把所有的数都异或,相同的数字异或为0,最后只剩下出现一次的数字,它和0异或,结果就是它本身。
扩展:
异或运算是位操作,需要将数转为二进制的原码,然后转为补码,将两数的补码按位进行异或,最后再转为原码即可。
代码:
public class singleNumber {
public static void main(String[] args) {
int[] data = new int[]{1, -5, 3, 1, -5};
System.out.println(singleNumber(data));
}
/**
* 异或解法(推荐使用)
* 把所有的数都异或,相同的数字异或为0,最后只剩下出现一次的数字,它和0异或,结果就是它本身
* @param nums
* @return
*/
public static int singleNumber(int[] nums) {
int num = 0;
for (int i : nums) {
num ^= i;
}
return num;
}
}