面试经典算法系列之数组/字符串3 -- 移除元素

面试经典算法题35-移除元素

LeetCode.27
公众号:阿Q技术站

问题描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路

方法一 遍历 - 去除匹配项
  1. 初始化一个变量 count 用于计数非给定值的元素。
  2. 遍历数组,当遇到非给定值的元素时,将其移到数组的前面,并增加 count
  3. 修改数组的长度为 count,即可移除给定值的元素。
方法二 双指针
  1. 初始化两个指针:我们使用两个指针 leftright,初始时都指向数组的开头。
  2. 遍历数组:遍历数组,当 nums[right] 等于给定值 val 时,右指针 right 向右移动一位;否则,将 nums[right] 的值赋给 nums[left],并同时将 leftright 向右移动一位。
  3. 返回新长度:遍历结束后,left 指向的位置即为新数组的长度。
方法三 双指针 - 交换移除
  1. 初始化两个指针 leftright,初始时 left 指向数组开头,right 指向数组末尾。
  2. nums[left] 等于给定值 val 时,将 nums[left]nums[right] 交换,并将 right 向左移动一位。
  3. 如果交换后的 nums[left] 仍然等于给定值 val,则继续交换直到 nums[left] 不等于 val
  4. left 向右移动一位,重复步骤 2 和 3,直到 left 大于等于 right
  5. 返回新数组的长度,即 left 的值。

图解

方法一

流程图

方法二

参考代码

C++
方法一
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i = 0; // 初始化指针 i,指向数组的第一个位置
        for (int j = 0; j < nums.size(); ++j) { // 遍历数组,j指向当前处理的元素
            if (nums[j] != val) { // 如果当前元素不等于给定值
                nums[i] = nums[j]; // 将当前元素移动到指针 i 的位置,并同时移动指针 i
                ++i; // 指针 i 向后移动
            }
        }
        return i; // 返回新数组的长度,即指针 i 的值
    }
};

int main() {
    vector<int> nums = {3, 2, 2, 3}; // 输入数组
    int val = 3; // 给定值
    Solution solution;
    int result = solution.removeElement(nums, val); // 移除给定值并返回新数组长度
    cout << "新数组长度:" << result << endl; // 输出结果
    return 0;
}
方法二
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0, right = 0; // 初始化左右指针
        while (right < nums.size()) { // 遍历数组
            if (nums[right] != val) { // 如果当前元素不等于给定值
                nums[left] = nums[right]; // 将当前元素赋值给左指针指向的位置
                left++; // 左指针向右移动一位
            }
            right++; // 右指针向右移动一位
        }
        return left; // 返回新数组的长度
    }
};

int main() {
    vector<int> nums = {3, 2, 2, 3}; // 输入数组
    int val = 3; // 给定值
    Solution solution;
    int result = solution.removeElement(nums, val); // 移除元素
    cout << "新数组长度:" << result << endl; // 输出结果

    return 0;
}
方法三
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0, right = nums.size(); // 初始化左右指针,left指向数组开头,right指向数组末尾的下一个位置
        while (left < right) { // 循环直到左指针大于等于右指针
            if (nums[left] == val) { // 如果左指针指向的值等于给定值
                nums[left] = nums[right - 1]; // 将左指针指向的值与右指针前一个位置的值交换
                right--; // 缩小数组长度
            } else { // 如果左指针指向的值不等于给定值
                left++; // 左指针右移
            }
        }
        return left; // 返回新数组的长度,即左指针的值
    }
};

int main() {
    vector<int> nums = {3, 2, 2, 3}; // 输入数组
    int val = 3; // 给定值
    Solution solution;
    int result = solution.removeElement(nums, val); // 移除给定值并返回新数组长度
    cout << "新数组长度:" << result << endl; // 输出结果
    return 0;
}
Java
class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0; // 初始化指针 i,指向数组的第一个位置
        for (int j = 0; j < nums.length; ++j) { // 遍历数组,j指向当前处理的元素
            if (nums[j] != val) { // 如果当前元素不等于给定值
                nums[i] = nums[j]; // 将当前元素移动到指针 i 的位置,并同时移动指针 i
                ++i; // 指针 i 向后移动
            }
        }
        return i; // 返回新数组的长度,即指针 i 的值
    }
}

public class Main {
    public static void main(String[] args) {
        int[] nums = {3, 2, 2, 3}; // 输入数组
        int val = 3; // 给定值
        Solution solution = new Solution();
        int result = solution.removeElement(nums, val); // 移除给定值并返回新数组长度
        System.out.println("新数组长度:" + result); // 输出结果
    }
}
Python
from typing import List

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i = 0  # 初始化指针 i,指向数组的第一个位置
        for j in range(len(nums)):  # 遍历数组,j指向当前处理的元素
            if nums[j] != val:  # 如果当前元素不等于给定值
                nums[i] = nums[j]  # 将当前元素移动到指针 i 的位置,并同时移动指针 i
                i += 1  # 指针 i 向后移动
        return i  # 返回新数组的长度,即指针 i 的值

# 测试代码
nums = [3, 2, 2, 3]  # 输入数组
val = 3  # 给定值
solution = Solution()
result = solution.removeElement(nums, val)  # 移除给定值并返回新数组长度
print("新数组长度:", result)  # 输出结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/616039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手把手微调大模型【附:一镜到底视频教程】

前言 近期有很多小伙伴来问是否有大模型微调教程&#xff0c;其实目前网上有很多教程&#xff0c;但是据了解&#xff0c;由于网上教程质量参差不齐&#xff0c;导致很多小伙伴尤其是初学者&#xff0c;一坑未出又入一坑&#xff0c;有种从入门到放弃的感觉。于是乎&#xff0…

信息检索(36):ConTextual Masked Auto-Encoder for Dense Passage Retrieval

ConTextual Masked Auto-Encoder for Dense Passage Retrieval 标题摘要1 引言2 相关工作3 方法3.1 初步&#xff1a;屏蔽自动编码3.2 CoT-MAE&#xff1a;上下文屏蔽自动编码器3.3 密集通道检索的微调 4 实验4.1 预训练4.2 微调4.3 主要结果 5 分析5.1 与蒸馏检索器的比较5.2 …

【0003day】VOSviewer分析

这个软件也可以用知网&#xff0c;也可以用web of science。 首先&#xff0c;需要创建数据。这个数据如何创建&#xff0c;需要参考对应的教程。&#xff08;本文以web of science为平台来做分析。&#xff09; 首先&#xff0c;创建对应的数据库。 一直下一步 让后选择完…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列&#xff08;哈希桶/拉链法&#xff09; 三、闭散列代码&#xff08;除留余数法&#xff09;四、开散列代码&#xff08;拉链法/哈希桶&#xff09; 一、unordered_set、unordered_map的…

【GO】go语言中的HTTP标准库 - http编程

上一节已经学习了HTTP的基础知识&#xff0c;本章将学习关于go语言的HTTP编程&#xff0c;最重要的是掌握 net/http 包的用法&#xff0c;以及如何自己编写一个简单的Web服务端&#xff0c;通过客户端访问Server端等。 编写简单的Web 服务器 http.ListenAndServe 启动 Http S…

maven deploy项目发布到中央仓库签名失败signing failed: No secret key

maven deploy项目发布到中央仓库签名失败signing failed: No secret key 执行操作 在我执行命令打包项目到中央仓库时失败 mvn clean deploy错误信息 [INFO] --- gpg:3.1.0:sign (sign-artifacts) LocalCache --- [INFO] Signing 4 files with 9961AA14xxxxxxxxxxxxxxD064…

JVM 类加载机制

JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…

【Unity 鼠标输入检测】

Unity 鼠标输入检测 Unity提供了多种方法来检测和处理鼠标输入&#xff0c;允许开发者在游戏中实现对鼠标移动、点击和滚轮滚动的响应。以下是一些基本的鼠标输入检测方法&#xff1a; 1. Input.mousePosition 这个属性返回当前鼠标指针的屏幕坐标。坐标是以像素为单位的&…

信息系统项目管理师0102:可行性研究的内容(7项目立项管理—7.2项目可行性研究—7.2.1可行性研究的内容)

点击查看专栏目录 文章目录 7.2项目可行性研究7.2.1可行性研究的内容1.技术可行性分析2.经济可行性分析3.社会效益可行性分析4.运行环境可行性分析5.其他方面的可行性分析记忆要点总结7.2项目可行性研究 可行性研究是在项目建议书被批准后,从技术、经济、社会和人员等方面的条…

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率&#xff08;线程处理请求的时间占比&#xff09;。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下&#xff0c;查看…

【免费Java系列】大家好 ,今天是学习面向对象高级的第十二天点赞收藏关注,持续更新作品 !

这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day10-多线程 一、多线程常用方法 下面我们演示一下getName()、setName(String name)、currentThread()、sleep(long time)这些方法的使用效果。 public class MyThread extends Thread{publi…

AI办公自动化-用kimi批量重命名Word文档

文件夹里面有很多个word文档&#xff0c;标题里面都含有零代码编程&#xff0c;现在想将其替换为AI办公自动化。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&am…

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

Github上 5 个好玩儿的开源项目

1. 在你的 Windows 养小猫 2. 把你的图片生成 ASCII 3. 中国制霸生成器 4. 像素风格代码字体 5. 梦回 QQ 空间 01 在你的 Windows 养小猫 在MacBook的触摸板上&#xff0c;你可以抚养一只小宠物&#xff0c;并与它互动、喂食&#xff0c;这样非常有趣。 我向你推荐了一个…

【Qt 学习笔记】Qt常用控件 | 容器类控件 | Group Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 容器类控件 | Group Box的使用及说明 文章编号&#xff…

外汇crm系统是什么

外汇CRM系统是一种专门为外汇交易市场设计的客户关系管理系统。它结合了外汇交易的特点和客户管理的需求&#xff0c;为外汇交易商提供了全面的解决方案。它的出现&#xff0c;极大地促进了外汇交易行业的发展&#xff0c;为交易商提供了更高效、更智能的客户管理方式。 一、外…

力扣每日一题124:二叉树中的最大路径和

题目 困难 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root…

08.3.grafana自定义图形

grafana自定义图形 找插件里面的zabbix 点击update 数据源—zabbix数据源,添加zabbix数据源 选择zabbix类型 我这里配置的是本地&#xff0c;所以URL直接localhost 这里配置zabbix登录账号密码Admin/zabbix 然后点击保存并测试&#xff0c;会直接显示版本 导入模板&…

电影网站|基于SSM+vue的电影网站系统(源码+数据库+文档)

电影网站 目录 基于SSMvue的电影网站系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

虚拟机CentOS密码重置

1&#xff0c;reboot重启 在出现下面的界面1按e 如果有选项就选择“CentOS Linux &#xff08;3.10.0-327.e17.x86_64&#xff09;7 &#xff08;Core&#xff09;”【我的电脑没有直接显示界面2】 界面1 界面2 2&#xff0c;在上述界面2中继续按e进入编辑模式 找到“ro cr…