题目描述:
给你一个整数数组
nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此
示例 1:
输入:nums = [2,2,3,2] 输出:3示例 2:
输入:nums = [0,1,0,1,0,1,99] 输出:99
题目分析:
本题中,我们第一时间会想到,遍历数组,对于数组中出现的每一个数字,找一个相对应的 变量来描述其出现的次数,直到数组遍历完毕,然后找到仅仅出现过一次的数。
刚好在我们所学习的有键值对特性的HashMap中,Key用来记录数组出现的数字,Value来记录相对性的数字出现的次数,我们在遍历数组时,每出现一个数字,我们就在其Value进行+1操作,最终我们找到Value等于1的Key值进行返回,则能完成此问题。
题目代码:
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i =0;i<nums.length ; i++){
if(map.containsKey(nums[i]))
map.put(nums[i],map.get(nums[i])+1);
else
map.put(nums[i],1);
}
for(Integer Key : map.keySet()){
if(map.get(Key) == 1)
return Key;
}
return -1;
}
}
代码分析
class Solution {
public int singleNumber(int[] nums) {
//首先通过泛型<Integer,Integer>创建HashMap
HashMap<Integer,Integer> map = new HashMap<>();
//for循环遍历数组
for(int i =0;i<nums.length ; i++){
//如果数组中的数值已经被记录,那么我们对其Value值进行+1操作
if(map.containsKey(nums[i]))
map.put(nums[i],map.get(nums[i])+1);
//如果数组中数值没有被记录,那么我们在map中添加Key,并将其Value值赋值为1
else
map.put(nums[i],1);
}
//增强for循环遍历数组,找到Value为1的Key值,进行返回
for(Integer Key : map.keySet()){
if(map.get(Key) == 1)
return Key;
}
//为了程序的严谨行而加,但是并不会执行
return -1;
}
}
时间复杂度O(n) 空间复杂度O(n)
代码中使用的函数
put() 方法
put() 方法将指定的键/值对插入到 HashMap 中。如果插入的 key 对应的 value 已经存在,则执行 value 替换操作,返回旧的 value 值,如果不存在则执行插入,返回 null。
get()方法
get() 方法获取指定 key 对应对 value。
containsKey() 方法
containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。
如果 hashMap 中存在指定的 key 对应的映射关系返回 true,否则返回 false。
keySet() 方法
keySet() 方法返回映射中所有 key 组成的 Set 视图。返回映射中所有 key 组成的 Set 视图。
题目总结
此解法为本题较为简单的方法,其效率还有所缺陷,主要是对HashMap的应用,通过本题对HashMap有更好的理解