数组-移除元素

目录

题目链接:27. 移除元素 - 力扣(LeetCode)

题目链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)

题目链接:283. 移动零 - 力扣(LeetCode)

题目链接:844. 比较含退格的字符串 - 力扣(LeetCode)

题目链接:977. 有序数组的平方 - 力扣(LeetCode)


题目链接:27. 移除元素 - 力扣(LeetCode)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 设前后两个指针,从前面和后面同时遍历
        int p=0,q=nums.size()-1;
        // 用于交换两个数
        int temp;
        // 当两个指针不错过时
        while(p<=q)
        {
            //注意这里要先判断交换。因为如果不先判断判断,有可能left走到right后面
            // 如果前指针指向的数=val且后指针指向的数不=val,那么可以交换
            if(nums[p]==val&&nums[q]!=val)
            {
                temp=nums[p];
                nums[p]=nums[q];
                nums[q]=temp;
            }
            // 如果前指针指向的数不=val则前指针继续向后
            if(nums[p]!=val)
            {
                p++;
            }
            // 如果后指针指向的数=val则后指针继续向前
            if(nums[q]==val)
            {
                q--;
            }
        }
        // 最后前p个都不=val,即新数组的长度
        return p;
    }
};

题目链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        // fast指向下一个不重复的数,slow指向下一个要赋值的位置
        int fast=-1,slow=-1;
        int len=nums.size();
        // slow=第一个重复元素位置
        for(int i=1;i<len;i++)
        {
            if(nums[i]==nums[i-1])
            {
                slow=i;
                break;
            }
        }
        // 如果数组中存在重复元素,则slow>0
        if(slow>0)
        {
            // fast从slow向后走,直到找到不重复的元素
            fast=slow+1;
            while(fast<len)
            {
                // 当fast指向的数不=slow指向的数的前一个,则将fast指向的数赋给slow位置
                // slow向后走,指向下一个要赋值的位置
                if(nums[fast]!=nums[slow-1])
                {
                    nums[slow]=nums[fast];
                    slow++;
                }
                // fast向后走,继续寻找不=slow指向的数的前一个数的位置
                fast++;
            }
            // 最终前slow个数即为新数组
            return slow;
        }
        // 如果没有重复的数,则返回原数组
        return len;
    }
};

题目链接:283. 移动零 - 力扣(LeetCode)

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int fast = -1, slow = -1;
        int len = nums.size();
        // 找到第一个=0的元素下标
        for (int i = 0; i < len; i++)
        {
            if (nums[i] == 0)
            {
                slow = i;
                break;
            }
        }
        // 如果数组中有=0的元素,则slow一定>=0
        if (slow >= 0)
        {
            // fast从slow向后寻找不=0的元素与slow位置交换
            fast = slow + 1;
            while (fast < len)
            {
                if (nums[fast] != 0 && nums[slow] == 0)
                {
                    nums[slow] = nums[fast];
                    nums[fast] = 0;
                    slow++;
                }
                // slow永远停在=0的位置,等待交换
                if (nums[slow] != 0)
                {
                    slow++;
                }
                fast++;
            }
        }
    }
};

题目链接:844. 比较含退格的字符串 - 力扣(LeetCode)

感觉还是没有弄懂快慢指针orz,写了好久

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        return getString(s)==getString(t);
    }
private:
    // 得到新字符串
    string getString(string s)
    {
        int len = s.size();
        // fast指向下一个能替换slow的字符,slow永远指向下一个等待替换的字符
        int fast = -1, slow = -1;
        // 找到字符串中第一个#的位置,令slow=#的前一个位置(因为要被替换),fast=#的后一个
        for (int i = 0; i < len; i++)
        {
            if (s[i] == '#')
            {
                fast = i+1;
                slow = i - 1>=0?i-1:0;
                break;
            }
        }
        // 如果字符串中有#则fast>0,如果字符串中没有#则fast为初始值-1
        if (fast > 0)
        {
            // 当fast遍历完整个字符串,则没有能替换的字符了
            while (fast < len)
            {
                // 当fast指向的字符不=#时,用fast字符替换slow字符,slow向后走
                if (s[fast] != '#')
                {
                    s[slow] = s[fast];
                    slow++;
                }
                // 如果fast字符=#则说明此时slow指向的前一个字符也要被替换,则slow--
                // 但如果此时slow=0,则无法再往前,slow不动
                else if (s[fast] == '#'&&slow!=0)
                {
                    slow--;
                }
                // fast往后走
                fast++;
            }
            // 字符串遍历完成后,slow指向下一个等待替换的字符,所以0-slow-1是新的字符串,擦除slow之后的字符
            s.erase(slow, len - slow);
        }
        return s;
    }
};

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

class Solution {
public:
    // 这道题算出来直接排序就可以,但是想用快慢指针写
    // 我感觉我都不知道是怎么写的……
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> numSort;
        int slow = -1, fast = -1;
        int len = nums.size();
        int left = 0, right = len - 1;
        int middle = 0;
        // 二分查找正负数的分界点
        while (left <= right)
        {
            middle = (left + right) / 2;
            if (nums[middle] == 0)
            {
                // 如果找到0则fast指向0,slow指向fast的前一个,即负数的开端
                fast = middle;
                slow=fast-1;
                break;
            }
            else if (nums[middle] > 0)
            {
                right = middle - 1;
            }
            else
            {
                left = middle + 1;
            }
        }
        // 如果找不到0则找到0的插入位置,插入位置为正数,前一位为负数
        if (fast == -1)
        {
            fast = right + 1;
            slow = fast - 1;
        }
        int fast2;
        int slow2;
        // 如果数组没有遍历完则继续遍历
        while (fast < len || slow >= 0)
        {
            // 如果正数部分遍历完毕,则只遍历剩下的负数部分
            if (fast >= len)
            {
                while (slow >= 0)
                {
                    slow2 = pow(nums[slow], 2);
                    numSort.push_back(slow2);
                    slow--;
                }
            }
            // 如果负数部分遍历完毕,则只遍历剩下的正数部分
            else if (slow < 0)
            {
                while (fast < len)
                {
                    fast2 = pow(nums[fast], 2);
                    numSort.push_back(fast2);
                    fast++;
                }
            }
            // 如果正数、负数部分都没有遍历完毕
            else
            {
                slow2 = pow(nums[slow], 2);
                fast2 = pow(nums[fast], 2);
                // 比较fast、slow指向的数的平方,小的填入新数组
                if (fast2 > slow2)
                {
                    numSort.push_back(slow2);
                    slow--;
                }
                else
                {
                    numSort.push_back(fast2);
                    fast++;
                }
            }
        }
        return numSort;
    }
};

上面是自己瞎写的,后来看代码随想录发现贼简单人傻了

class Solution {
public:

    vector<int> sortedSquares(vector<int>& nums) {
    
    //突然发现代码随想录不是这么写的
    //不用寻找正负分界处,直接从头尾比较,结果数组从后面排
    //因为头尾一定是平方最大的,越往中间走越小
    int slow=0,fast=nums.size()-1;
    vector<int> res(nums.size(),-1);
    int i=res.size()-1;
    while(slow<=fast)
    {
        if(nums[slow]*nums[slow]>=nums[fast]*nums[fast])
        {
            res[i]=nums[slow]*nums[slow];
            slow++;
        }
        else
        {
            res[i]=nums[fast]*nums[fast];
            fast--;
        }
        i--;
    }
    return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值