剑指offer03:数组中重复的数字——obj[num[i]]=1而不能用==1 && 用ES6中的set方法

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

1、哈希表

注意到只要判断数字是否重复,不用关系数字的顺序,只需要hash表存储之前遍历的,如果后续遍历已经在hash表上,就返回

(1)用一下key值

var findRepeatNumber = function(nums) {
var obj={};
for(i=0;i<nums.length;i++){
    if(!obj[nums[i]]){
    obj[nums[i]]=1;
    }else{
    obj[nums[i]]++
    }
}
var num=0;
for(var key in obj)
if(obj[key]>1){
    num=key;
    return num;
}
};

(2)直接用

var findRepeatNumber = function(nums) {
var obj={};
for(i=0;i<nums.length;i++){
    if(!obj[nums[i]]){
    obj[nums[i]]=1;
    }else{
    return nums[i];
    }
}
};

2、set方法

因为set会自动忽略重复的元素,就算用add添加给set,只要时重复的,set都不会接收,长度也不会变。所以我们取最开始的数组s的长度,将每个num[i]添加给s,如果长度增加,说明set之前没有此元素,如果长度不变,说明set中存在此元素。

var findRepeatNumber = function(nums) {
    let s=new Set();
    for(i=0;i<nums.length;i++){
        var len=s.size;   //这里要用size,用length不对
        s.add(nums[i]);
        if(s.size==len){
            return nums[i]
        }
    }
};

3、set方法知识点

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,里面没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。

const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
  console.log(i);
}
// 2 3 5 4

上面代码通过add方法向 Set 结构加入成员,结果表明Set 结构不会添加重复的值。

// 例一
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
// 例二
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5

还有一种函数法数组去重

function dedupe(array) {
  return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
  • Set 实例的方法:
  • add(value):添加某个值,返回Set结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值