开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第44天,点击查看活动详情
题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。
来源:力扣(LeetCode)
- 示例 1
输入: nums = [2,2,3,2]
输出: 3
- 示例 2
输入: nums = [0,1,0,1,0,1,99]
输出: 99
思路分析
根据题意可知,题目给出一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。现在需要找出这个只出现过一次的元素,并将它返回出来。
这种计算次数的题目,需要将元素和元素出现的次数对应起来,不能只存一个,所以这里最好就是使用对象存,对象的键存元素,对象的值存相应元素出现的值,这样就可以知道哪个元素只出现一次并且能取到那个元素。不过这里有个更好的数据结构map来代替对象。
先new一个map出来。循环数组nums,在每次循环中判断map里面是否有当前元素,如果没有就添加进去,次数添加1一次。如果map里面有当前元素,那就在当前出现的次数再添加一次,直至循环结束。
现在数组nums里面所有元素及元素出现的次数都完整的记录在map里面,所以只要循环map就可以。将map转化为数组格式,再循环它,不过这里的循环项是一个数组,第一个元素是map的键,第二个元素是map的值,所以只要循环到map的值等于1,那么就可以把当前的键返回出去。
AC代码
function solution(nums) {
let map = new Map();
for( const item of nums) {
if(map.has(item)) {
map.set(item, (map.get(item) + 1));
} else {
map.set(item, 1);
}
}
for(item of [...map]) {
if(item[1] === 1) {
console.log(item[0])
return item[0];
}
}
}
let nums = [2,2,3,2];
solution(nums);