[leetcode刷题系列]之 数组中是否存在重复元素

617 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目一:

给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

审题

  • 整数数组中任何一个元素出现两次及两次以上即返回true,否则返回false。换句话说也就是说如果这个整数数组中没有重复项则返回false,否则返回true。

不怎么样的解法

  • 利用对象的键的唯一性。循环数组元素将其作为对象的key,如果不存在则其值记为1,如果存在则其值加1,最后取obj的值的数组,如果其中有任意一项大于等于2则返回true。 代码如下:
var containsDuplicate = function(nums) {
    let obj = {}
    for(let i=0; i<nums.length; i++) {
        if(!obj[nums[i]]) {
            obj[nums[i]] = 1
        } else {
            obj[nums[i]] += 1
        }
        
    }
    return Object.values(obj).some(val => val >=2)
};

排序解法

  • 将整数数组排序之后,数组的重复元素一定出现在相邻的位置中,然后对已经排序的数组进行循环,只要判断两个相邻的元素是否相等即可,如果相等则说明存在重复元素。 代码如下:
var containsDuplicate = function(nums) {
    nums.sort((a, b) => a - b);
    const len = nums.length;
    for(let i = 0; i < len -1; i++) {
        if (nums[i] === nums[i+1]) {
            return true;
        }
    }
    return false;
};

es6的Set结构解法

  • 利用Set结构中的元素的唯一性,循环数组,如果set中已经存在了该元素,则说明重复,否则将该元素添加到set中,最终返回false。代码如下:
var containsDuplicate = function(nums) {
    const set = new Set();
    for (const x of nums) {
        if (set.has(x)) {
            return true
        }
        set.add(x)
    }
    return false
};

总结

其实这个题是相对简单的,主要是看你的解题思路,以及思考方向。对于一个不怎么会算法的前端来说,可能一上来就会直接了当的干第一种方法,对 Set结构熟悉的人呢可能优先会考虑这种方式解题,经常做算法的人呢则可能更倾向于先排序之后利用其本身的特性来解题。总之,万变不离其宗,就看你是从哪个角度去思考问题了。加油吧,骚年!