在长度 2N 的数组中找出重复 N 次的元素

158 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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对比,相等的那个就是了。