前端算法-删除有序数组中的重复项

99 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

题目

给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 ,由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果,将最终结果插入 nums 的前 k 个位置后返回 k 。

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

题解

这个我们可以看成是返回数组去重后的长度,只不过去重是在数组本身上进行去重的,我们这里可以借助Set数据结构进行实现,我们进去之后先判断当前的出参nums是不是一个数组或当前出参nums的长度是不是等于0,如果满足其中一个条件我们则直接返回false,如果不满足我们就声明一个set变量,它是一个空的Set数据结构,我们对出参nums进行循环,在循环中我们先获取到当前循环中出参的值并且放到item变量中,然后使用if语句结合Set数据结构的has方法进行判断,如果当前item变量的值在set变量中,那么我们就对出参nums使用splice方法,将当前循环中的值从其中截取下来,并将当前循环的下标自减1,以便于在下次循环中不会因为删除了当前值而跳过后补过来的值,如果item变量值不在set变量中则直接使用Set数据结构中的add方法将item变量值直接添加道Set变量中,以便下次循环进行来方便使用has方法进行判断,当整个循环完成之后,我们直接将出参nums的长度返回出去即可

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    if(!Array.isArray(nums) || nums.length === 0) {
       return false;
    }
    let  set = new Set();
    for(let i = 0; i< nums.length; i++){
        let item = nums[i]; 
        if(set.has(item)){
            nums.splice(i, 1);
            i--;
        }else{
            set.add(item);
        }
    }
    return nums.length;
};

这道题实现的方法有很多,还可以使用Map数据结构进行实现,也是通过Map数据结构中的自带方法进行判断,思路大致相同,我这里就不写实现了

坚持努力,无惧未来!