leetcode27移除元素

本文主要讲解移除元素的要点与细节,按照步骤思考更方便理解

给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于 val的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

c++与java代码如下,末尾

具体要点:

  1. 这道题要求我们移除数值等于val的元素,并且是在数组中原地操作,不能使用额外的空间,一提到原地操作,就要想到使用双指针的方法类似题目

即,当我们删除值为val的元素后,我们就要把后面的元素一个个递补上来,补全空缺的位置


  1. 既然我们确定使用双指针,那么就要想一下具体使用快慢指针 ,还是左右指针呢?

解决这个问题,我们需要考虑一下每个指针的含义:我们需要一个指针去找元素 ,另一个指针去找位置 ,把找到符合要求的元素 放到正确位置上。以此来实现元素的递补。

所以就要使用快慢指针,其中快指针用来寻找不等于val的元素,慢指针表示递补上来的位置。

当 nums[fast] != val时,就把该元素放到slow位置上


3. 细节问题

我们需要考虑一下快慢指针的初始化问题,对于初始化,还有其他边界条件,我们可以举个例子

fast到底初始化为0呢,还是1呢?

当fast初始化为0 时,表示循环中要对第一个值进行判断是否等于val

当fast初始化为1 时,表示循环中不对第一个值进行判断是否等于val,我们就要单独判断一下起始位置。

所以综上,尽量还是fast=0


这道题主要就是考察双指针的思路,并不是那么难,只要搞清楚定义出来的两个指针分别的什么含义,代码也就手到擒来。希望我的讲解能有对你有一点帮助

c++代码如下

cpp 复制代码
#include <vector>
using namespace std;

class Solution{
public:
    int removeElement(vector<int>& nums, int val){
        int fast = 0, slow = 0;
        for (fast = 0;fast < nums.size();fast++) {
            //fast代表元素值
            //slow代表要放置的位置
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
};

java代码如下:

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0, fast = 0;
        for (fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
}
相关推荐
Peter(阿斯拉)7 分钟前
[Java性能优化]_[时间优化]_[字符串拼接的多种方法性能分析]
java·性能优化·stringbuilder·string·字符串拼接·stringbuffer·时间优化
fqbqrr8 分钟前
2508C++,支持rdma通信的高性能rpc库
c++·rpc
Moshow郑锴23 分钟前
机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法
算法·机器学习·回归
liulilittle40 分钟前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路
剪一朵云爱着1 小时前
PAT 1065 A+B and C (64bit)
算法·pat考试
闪电麦坤951 小时前
数据结构:在二叉搜索树中插入元素(Insert in a BST)
数据结构·二叉树··二叉搜索树
闪电麦坤951 小时前
数据结构:用链式队列实现层序遍历 (Level-order Traversal)
数据结构··遍历
喜欢吃燃面1 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
草莓熊Lotso1 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
困鲲鲲1 小时前
CPP多线程2:多线程竞争与死锁问题
c++·多线程·死锁