当前位置: 首页 > news >正文

力扣面试经典算法150题:删除有序数组中的重复项

删除有序数组中的重复项

今天的题目是力扣面试经典150题中的数组的简单题: 删除有序数组中的重复项

题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150

题目描述

给定一个非严格递增排列的数组 nums,编写一个程序来删除数组中的重复项,使得每个元素只出现一次,并返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回 nums 中唯一元素的个数。

  • 注意:
    • 不需要考虑超出新长度以外的元素。
    • 必须在原地修改输入数组,不能使用额外的数组空间。
  • 示例:
    • 输入:
      nums = [1,1,2]
    • 输出:
      新长度为 2,数组变为 [1,2](注意:返回值为新长度,数组内容可以不是连续的)
    • 解释:
      数组 nums 中的值 1 出现了两次,需要保留一次。
      移除多余的重复项后,新数组长度为 2,数组内容为 [1,2]。

题目分析

简单分析题目,可以得到以下题目要求:

  1. 数组题目
  2. 比较元素是否一致;
  3. 移出重复元素;
  4. 不使用额外空间;
  5. 返回唯一元素的个数。

以上四个内容就是我们需要实现的内容,分析完题目需求,针对需求进行解题。

解题思路

在数组题目中,不使用额外空间同时要比较,移出元素,先考虑双指针法。双指针法的内容之前讲过,这里不重复。

双指针法的话,我们要考虑要几个指针,每个指针起什么作用,怎么使用指针。

  • 根据题目内容,我们需要比较和移除元素,因为要比较,所以起码是两个指针,我们假定先使用两个指针。

  • 我们需要比较元素是否一致,如果一致,我们需要移除一个,保留一个。因为我们不使用额外的空间,所以要将值设置回数组。

  • 两个指针一个从0开始,一个指针从1开始,并且循环也从1开始,因为需要比较两个元素,没法从0开始遍历。同时从0开始的指针是设置新元素的指针。从0开始的指针只有当元素不重复时,指针后移以为,放入相比的第二个元素。

  • 作为设置值的指针,就是新的没有重复元素的指针,题目需要的唯一元素的数量的值,是指针所在下标的值+1.

实际算法代码

根据以上分析和思路,我们可以写出以下代码:

import java.util.Arrays;/*** description** @author xieqin* @date 2024/8/7 13:45*/
public class RemoveDuplicates {/*** 删除数组中的重复项** @param nums 输入数组* @return 删除重复项后的新数组长度*/public int removeDuplicates(int[] nums) {if (nums.length == 0) return 0;// 从0开始遍历数组的指针i,这个指针也是将不重复的值放入数组的指针int i = 0; // 从1开始遍历数组的指针j,主要用来作比较的指针for (int j = 1; j < nums.length; j++) {// 在两两比较时,如果第二个元素与第一个元素不相等,新数组的指针+1放入元素.if (nums[j] != nums[i]) {// 不相同,指针i加1,,因为当前指针的位置已经有一个没有重复的值,所以加1放入。这样下次循环比较的就是这个下标的值。i++;// 将不重复的元素复制到新位置nums[i] = nums[j]; }}// 返回新数组的长度return i + 1; }public static void main(String[] args) {RemoveDuplicates solution = new RemoveDuplicates();// 示例数据int[] nums = {1, 1, 2};// 调用移除重复项方法int newLength = solution.removeDuplicates(nums);// 输出新长度和移除重复项后的数组System.out.println("New length: " + newLength);System.out.println("Modified array: " + Arrays.toString(Arrays.copyOfRange(nums, 0, newLength)));}
}

提交运行,通过测试。
在这里插入图片描述

总结

双指针法作用依旧强劲!重点在于确定指针各自的作用,并合理利用两个指针完成想要实现的逻辑。

相关文章:

力扣面试经典算法150题:删除有序数组中的重复项

删除有序数组中的重复项 今天的题目是力扣面试经典150题中的数组的简单题: 删除有序数组中的重复项 题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一…...

文本加密工具类-支持MD5、SHA1、SHA256、SHA224、SHA512、SHA384、SHA3、RIPMD160算法

文本加密工具类 1.算法简介1.1 MD51.2 SHA-11.3 SHA-2&#xff08;推荐使用&#xff09;1.4 SHA-3&#xff08;推荐使用&#xff09;1.5 RIPEMD-160 2.工具类案例2.1POM导入2.2代码编写2.3 输出示例 1.算法简介 1.1 MD5 MD5 (Message-Digest Algorithm 5) 描述&#xff1a;M…...

LVS集群中的负载均衡技术

目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…...

Java网络编程——HTTP协议原理

协议 我们在网上冲浪时&#xff0c;会在浏览器地址栏输入一个网址&#xff0c;然后就能打开网页了。比如&#xff0c;输入 https://www.douban.com/就可以访问到豆瓣的主页&#xff1a; 那么大家是否好奇&#xff1a;https 是什么意思&#xff0c;作用又是什么呢&#xff1f;…...

java之多线程篇

一、基本概念 1.什么是线程&#xff1f; 线程就是&#xff0c;操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。简单理解就是&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能 2.什么是多线程&#xff1f; 有了多线…...

【深度学习】TTS,CosyVoice,训练脚本解析

https://github.com/FunAudioLLM/CosyVoice/blob/main/examples/libritts/cosyvoice/run.sh Bash 脚本是一个语音合成(TTS)训练和推理的完整流水线。让我们逐步解析这个脚本的各个部分。 初始化部分 #!/bin/bash # Copyright 2024 Alibaba Inc. All Rights Reserved. . ./…...

《Unity3D网络游戏实战》学习与实践

纸上得来终觉浅&#xff0c;绝知此事要躬行~ Echo 网络上的两个程序通过一个双向的通信连接实现数据交换&#xff0c;这个连接的一端称为一个Socket “端口”是英文port的意译&#xff0c;是设备与外界通信交流的出口。每台计算机可以分配0到65535共65536个端口 每一条Sock…...

Machine_Matrix打靶渗透【附代码】(权限提升)

靶机下载地址&#xff1a; https%3A%2F%2Fdownload.vulnhub.com%2Fmatrix%2FMachine_Matrix.zip 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:D9:36:81 1.2. 端口扫描 nmap -p- 192.168.7.155 1.3. 目录扫描 dir…...

代码随想录算法训练营Day22 | Leetcode 77 组合 Leetcode 216 组合总和Ⅲ Leetcode17 电话号码的字母组合

前言 回溯算法中递归的逻辑不重要&#xff0c;只要掌握回溯的模板以及将问题转化为树形图&#xff0c;整个问题就很好解决了&#xff0c;比二叉树简单。 Leetcode 77 组合 题目链接&#xff1a;77. 组合 - 力扣&#xff08;LeetCode&#xff09; 代码随想录题解&#xff1a;…...

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript 微信小程序的业务逻辑都是通过JavaScript语言来实现的&#xff0c;本章我们将详细的讲解JavaScript的基本概念&#xff0c;以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言&#xff0c;是一种动态…...

K-近邻算法(一)

一、 K- 近邻算法 (KNN) 概念 1.1 K- 近邻算法 (KNN) 概念 K Nearest Neighbor 算法⼜叫 KNN 算法&#xff0c;这个算法是机器学习⾥⾯⼀个⽐较经典的算法&#xff0c; 总体来说 KNN 算法是相对⽐ 较容易理解的算法 定义 : 如果⼀个样本在特征空间中的k 个最相似 ( 即特征空间…...

从零开始之AI视频制作篇

从零开始之AI视频制作篇 文章目录 从零开始之AI视频制作篇前言一、工具列表二、成片展示三、制作流程1、获取图片素材2、图片生成视频2.1 Runway操作流程 3、文本生成语音3.1 Fish Audio操作流程 4、视频剪辑4.1 音频素材4.2 字幕生成 四、Runway提示词参考&#xff1a;参考 前…...

Java之TCP编程综合案例

1.反转案例 搭建一个TCP客户端&#xff0c;从键盘录入整行数据&#xff08;遇到quit结束录入&#xff09;然后发送给服务器&#xff0c;再接收服务器返回的数据并输出。 package com.briup.chap12;public class Test064_ReversalClient {public static void main(String[] ar…...

【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析&#xff0c;本篇文章主要讲述了&#xff1a;数据查询操作&#xff0c;数据增删改操作&#xff0c;索引和列名操作等等。欢迎大家一起探索讨论&#x…...

Spring Cloud全解析:注册中心之Eureka服务获取和服务续约

服务获取和服务续约 eureka客户端通过定时任务的方式进行服务获取和服务续约&#xff0c;在com.netflix.discovery.DiscoveryClient类中&#xff0c;启动了两个定时任务来进行处理 private void initScheduledTasks() {// 是否需要拉取if (clientConfig.shouldFetchRegistry(…...

三相整流电路交流侧谐波仿真分析及计算

一、三相桥式全控整流电路和功率因数测量电路SIMULINK 模型 如图4-1&#xff0c;根据高频焊机的主电路机构和工作原理&#xff0c;可将高频焊机三相整流部分等效为阻感负载的三相桥式全控整流电路模型&#xff0c;其由三相交流电压源、三相晶闸管整流桥、同步六脉冲触发器和阻感…...

了解Java中的反射,带你如何使用反射

反射的定义 反射&#xff08;Reflection&#xff09;是Java的一种强大机制&#xff0c;它允许程序在运行时动态地查询和操作类的属性和方法。通过反射&#xff0c;Java程序可以获取类的信息&#xff0c;比如类的名称、方法、字段&#xff0c;以及可以动态地创建对象、调用方法…...

【c++】基础知识——快速入门c++

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…...

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下&#xff0c;为啥这样子计算&#xff0c;研究这个自注意力花了不少时间&#xff0c;网上很多讲概念&#xff0c;但是没有具体的流程图和计算方式总结…...

JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件

目录 一. JavaScript、HTML、CSS简介 1.1 HTML简介和举例说明 1.2 CSS简介和举例说明 1.3 JavaScript 简介和举例说明 二. JavaScript 基本语法 2.1 变量类型和定义方式 2.2 逻辑运算符&#xff0c;比较运算符 2.3 流程控制&#xff0c;if&#xff0c;if...else...&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...