题目如下:
找出数组中重复的数字。
在一个长度为 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];
};
};
};
通过了测试用例。
好的解法:
一、哈希表
通过题意,我们可以使用哈希表来实现,分析如下:
- 遍历数组,若当前数字不存在与哈希表,则添加到哈希表即可。
- 若当前数字哈希表中已存在,则返回结果。
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
注意:
- Map.prototype.has(key)方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
- 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。