ipad不就是拿来刷题做笔记的吗 | 刷题打卡

1,573 阅读3分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组,并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = [1,1,1,2,2,3]

输出:5, nums = [1,1,2,2,3]

解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]

输出:7, nums = [0,0,1,1,2,3,3]

解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/re…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

其实,做题是讲究套路的,这也印证了很多大佬说力扣刷上三百道题就可以掌握规律。这个规律说白了就是做题的一些套路。

就像这道题,其实我们看到有序数组这两个关键词就应该联想到用双指针去解决。

  1. 利用双指针,左指针暂时固定不动,右指针不断移动
  2. 创建一个count值记录出现过的相同数字的次数
  3. 当两个指针指向的值相同时count值+1,并且判断count值是否大于等于3,如果是就删除该元素,并且更新count值和右指针
  4. 如果两个指针不相等,则说明遇到了新的值,则将左指针更新到右指针的位置,重置count值为1,因为左指针移动到右指针时就说明该值已经出现了一次
  5. 遍历完成,返回数组长度即可

(高能!灵魂画手上线) IMG_81ED43515B1E-1.jpeg

三、AC 代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    // 左指针
    let l = 0;
    // 右指针
    let r = 0;
    // 初始次数
    let count = 0;
    // 遍历数组
    while(r < nums.length){
        // 如果两个指针指向的数字相同
        if(nums[l] === nums[r]){
            // 次数+1
            count+=1;
            // 判断次数是否大于等于3
            if(count>=3){
                // 是,就删除该元素
                nums.splice(r,1);
                // 更新count值
                count-=1;
                // 因为原数组已经被删除了一个元素,所以这里的右指针也要向后移动一位
                r--;
            }
        // 指针指向的数字不同,就说明遇到了新的值,则更新左指针和count值
        }else {
            l = r;
            count = 1;
        }
        // 不断移动右指针
        r++;
    }
    // 返回数组的长度
    return nums.length;
};

四、总结:

这道题时今天的每日一题,大家可以尝试一下,题目整体难度感觉还是比较简单的。

这道题是自己一遍做出来的,所以没怎么看题解,也没有采用题解的方案,可能题解做的更简单,但是我还是喜欢用我的套路,因为自己的思路理解起来是比较清晰的,所以建议大家做的时候也自己尝试一遍先~