【leetcode刷题笔记】1.数组中重复的数字(简单)

题目如下

找出数组中重复的数字。


在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

第一次尝试

思路:考虑使用js中的set数据结构来解决,set数据结构类似于数组,但成员的值都是唯一的。

注意

1.set数据结构保存值是这样的:

因此比较时不可以直接比较对应的值,会产生错误。这里选择了使用Array.from把set转化为数组再进行比较。

 代码如下:

var findRepeatNumber = function(nums) {
    const s = new Set();
    nums.forEach(x=>{s.add(x)});
    const nums2 = Array.from(s);
    for(let i=0;i<nums.length;i++){
        if(nums[i] !== nums2[i]){
            return nums[i];
        };
    };
};

 通过了测试用例。

好的解法

一、哈希表

通过题意,我们可以使用哈希表来实现,分析如下:

  1. 遍历数组,若当前数字不存在与哈希表,则添加到哈希表即可。
  2. 若当前数字哈希表中已存在,则返回结果。
var findRepeatNumber = function(nums) {
    let map = new Map();
    for(let i of nums){
        if(map.has(i)) return i;
        map.set(i, 1);
    }
    return null;
};

作者:demigodliu
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/ha-xi-biao-shu-zu-zhong-zhong-fu-de-shu-bh7co/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注意:

  1. Map.prototype.has(key)方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
  2. Map.prototype.set(key, value)方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

二、仍然使用set

因为set自动忽略重复元素,遍历数组中元素,若长度未增加,则输出当前元素。

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    let s=new Set();
    for(var i in nums){
        var curLenth=s.size;
        s.add(nums[i]);
        if(s.size==curLenth)
        return nums[i];
    }
};

作者:miemiemie-3
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/set-by-miemiemie-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值