在一个长度为 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()
:清除所有成员,没有返回值。