只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
(上述题目来源于LeetCode)
解法一(哈希表)
class Solution {
public int singleNumber(int[] nums) {
//将数组中的数据放到哈希表中,通过key找value,如果value等于1,则符合题目要求
//新建一个hashmap
Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
//将数组中的元素遍历得到,通过key去找value,如果value为空,说明hashmap中没有,如果有,value++
for(Integer i : nums){
Integer count = hashmap.get(i);
if(count == null){
hashmap.put(i,1);
}else{
count++;
hashmap.put(i,count);
}
}
//遍历得到所有key,然后通过hashmap.get()得到相应的value,如果value等于1,说明
//该数字只出现了一次,此时返回该key
//hashmap.keySet()方法用来返回所有key组成的集合试图
for(Integer i : hashmap.keySet()){
Integer count = hashmap.get(i);
if(count == 1){
return i;
}
}
//如果都不等于1,返回-1,说明此时hashmap中全是出现两次的数字
return -1;
}
}
解法二(双层循环)
class Solution {
public int singleNumber(int[] nums) {
//暴力解法,两次循环
//第一层循环
for(int i = 0;i < nums.length;i++){
//设定一个flag,用来判断该数字是否符合题目要求
boolean flag = true;
//第二层循环,遍历数组,将数组中每一个数与其他数字进行比较
//如果有相同数字且下标不同,则不符合要求,flag为false
for(int j =0;j < nums.length;j++){
if(nums[i] == nums[j] && i != j){
flag = false;
break;
}
}
//第二层循环结束后,若没有相同的数字,则这个数符合题目要求
if(flag == true){
return nums[i];
}
}
//全部遍历完后没有找到符合题目的数字,返回-1
return -1;
}
}
解法三(运用位运算–异或)
class Solution {
public int singleNumber(int[] nums) {
//运用异或运算
//任何一个数异或0等于任何数
int num = 0;
//如果数组长度为奇数,则必定有一个数字是只出现一次的(根据题目要求)
if(nums.length % 2 != 0){
for(int i = 0;i < nums.length;i++){
//^是异或运算符
//两个相同的数异或等于0,0和任何数异或等于任何数
//因此数组中所有数进行异或运算,最后得到的数即为只出现一次的数
num = num ^ nums[i];
}
}
return num;
}
}