一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
题目描述
给你一个整数数组 nums ,该数组具有以下属性:
- nums.length == 2 * n.
- nums 包含 n + 1 个 不同的 元素
- nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。(出自力扣)
- 示例1
输入: nums = [1,2,3,3]
输出: 3
- 示例2
输入: nums = [2,1,2,5,3,2]
输出: 2
- 示例3
输入: nums = [5,1,5,2,5,3,5,4]
输出: 5
提示:
- 2 <= n <= 5000
- nums.length == 2 * n
- 0 <= nums[i] <= 104
- nums 由 n + 1 个 不同的 元素组成,且其中一个元素恰好重复 n 次
思路分析
根据题意可以知道,整数数组nums长度是2n+1,但不同的元素只有n+1个,也就是说那个重复的元素有n个;
这道题也可以说是一道计数题目,我们需要找到每一个元素,然后算出他们出现的次数,再把他们出现的次数和n对比,看哪个次数和它相同,若是相同就把当前元素return出去。
1、声明一个新的空对象obj;
2、循环数组,判断当前元素是否在对象里面,若是没有,就将元素当做对象的键,元素出现的次数当做对象的值,若是当前元素出已出现在对象里面,就将它的出现次数加1;直至循环数组结束。
3、利用 for in 来循环对象obj,取出对象的值(也就是数组元素出现的次数)和n对比,若是不相等则不需要管他,若是相等,则当前的元素就是那个重复出现n次的元素,将obj当前key return出去。
AC代码
let arr = [3,4,63,7,7,7]
function repeatedNTimes( arr ){
let n = arr.length / 2;
let obj = {};
for(let i=0;i<arr.length;i++) {
if(obj[arr[i]]) {
obj[arr[i]]++
}else{
obj[arr[i]] = 1
}
}
for(let key in obj) {
if(obj[key] === n) {
console.log(key)
}
}
}
repeatedNTimes( arr );
总结
这个题目主要就是计数,将数组各个元素出现的次数计算出来,然后一一和n对比,相等的那个就是了。