CC++解OJ题——移除元素

CC++解OJ题——移除元素,第1张


  所学习的东西要去实践,不然只是你以为你会了。

一.原题如下

  给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,并返回移除后数组的新长度。
  不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。
  元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

二.示例如下


四.分析与图示
  根据题意,依旧采用快慢双指针。起初让两个指针都指向数组第一个元素的位置,如果快指针所指示的位置元素同val值相等,则让fast++,否则将fast所指示的数组元素,赋值给slow所指示的数组元素,同时slow++后,再fast++…。用图示描述如下:

  不需要移除,两者同时移动,如下:

  同理:

  此时fast所指示的元素需要被覆盖,则只需要Fast移动,slow不动,如下:

  同理:
  上述图示中,fast所指示的数据元素同val不相等,则需要将其移动到slow所指示的位置上,即赋值给slow,赋值后slow指向下一个位置,fast指向下一个位置,如下:

  最终结果,如下:
  fast的值不小于数组元素个数,循环结束,最终slow的值就是新数组元素的数组元素个数。


五.代码实现

//C实现
int removeElement(int* nums, int numsSize, int val){
    int slow=0;//慢指针
    int fast=0;//快指针
    while(fast<numsSize)
    {
        if(nums[fast]!=val)
        {
            nums[slow]=nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}
//C++实现
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow=0;
        int fast=0;
        while(fast<nums.size())
        {
            if(nums[fast]!=val)
            {
                nums[slow]=nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }

我是老胡,又是充实的一天!❤️ ❤️

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1325722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存