剑指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;i1){
    num=key;
    return num;
}
};

(2)直接用

var findRepeatNumber = function(nums) {
var obj={};
for(i=0;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

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():清除所有成员,没有返回值。

你可能感兴趣的:(剑指offer)