【我也想刷穿 LeetCode啊】961. 在长度 2N 的数组中找出重复 N 次的元素

63 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

给你一个整数数组 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 次

来源:力扣(LeetCode) 链接:leetcode.cn/problems/n-… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。-

二、思路分析

建立hash,将数组中各元素和该元素出现次数一一对应,再遍历hash,如果遍历的当前元素出现次数等于nums.length /2,则返回该元素,因为题目前提已经给出大小为2N的数组,且有一个元素重复N次,所以数组长度必然是偶数,不用考虑长度除不尽以及没有符合条件元素的情况

三、代码实现

/**
 * @param {number[]} nums
 * @return {number}
 */
var repeatedNTimes = function(nums) {
    let hash = new Map()
    for(let i of nums){
        hash.get(i)?hash.set(i,hash.get(i)+1):hash.set(i,1)
    }
    for(let i of hash){
        if(i[1]===nums.length/2){
            return i[0]
        }
    }
};





或者随机选择

/**
 * @param {number[]} nums
 * @return {number}
 */
var repeatedNTimes = function(nums) {
    const len = nums.length;
    while(true) {
        const x = Math.floor(Math.random() * len);
        const y = Math.floor(Math.random() * len);
        if(x !== y && nums[x] === nums[y]) {
            return nums[x];
        }
    }
};


四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~