LeetCode 26

这个题目的意思是给你一个数组,删除里面重复的数字,然后返回数组的长度。第一反应是它很简单,不过还是调试了几次才写出来的,确实是一个循环就能解决的问题,不过我觉得其中还是需要注意一下东西:

1.先找到第一次出现相同的位置,这样方便解题(我是按照我下面的代码来说明的,当然你可能会有别的方法)

2.遇到相同元素时,记录第一次出现的位置prev,然后找到不是这个元素时停止,将这个元素加入到不重复序列中

3.想一想还有这样一种情况,就是前面有一些元素不同,但是突然出现了相同元素,这个时候需要注意代码的控制,否则最后的结果可能会出现重复的数字,我们应该将这个特殊数字加入到不重复序列后,再移动cur,使其和前面的序列不重复为止。

综上,代码如下:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) 
    {
        /*
            1.不准备额外使用空间
            2.返回删除重复节点后的数组长度
            3.数组有序
        */    
        int len = nums.size();
        if(len == 0 || len == 1)
        {
            return len;
        }
        int only = 0; // 用于记录不重复的下标,最后该下标以及以前的部分都是only one 
        int prev = 0;
        int cur = 1;  //用于遍历
        
        
        //找出前面不相同的序列
        while(cur<len && nums[only] != nums[cur])
        {
            ++cur;
            ++only;
        }
        if(cur == len)
        {
            return only+1;
        }
        
        while(cur < len)
        {
           if(nums[cur] == nums[cur-1])
           {
               prev = cur-1;
               while(cur<len && nums[prev] == nums[cur])
               {
                  ++cur;
               }
               nums[only++] = nums[prev];
           }
           else
           {
               nums[only++] = nums[cur++];
               while(cur < len && nums[cur] == nums[cur-1])
               {
                  ++cur;
               }
           }
        }
        
        return only;
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值