代码随想录刷题笔记-数组篇

文章目录

  • 代码随想录刷题笔记-数组篇
    • 27 移除元素
      • 力扣地址
      • 题目描述
      • 题目实例
      • 解题思路
      • 代码实现
    • 26. 删除有序数组中的重复项
      • 力扣地址
      • 题目描述
      • 题目示例
      • 解题思路
      • 代码实现
    • 283. 移动零
      • 力扣地址
      • 题目描述
      • 题目实例
      • 解题思路
      • 代码实现

代码随想录刷题笔记-数组篇

27 移除元素

力扣地址

https://leetcode.cn/problems/remove-element/description/

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
用户评测:评测机将使用以下代码测试您的解决方案:int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。// 它以不等于 val 的值排序。int k = removeElement(nums, val); // 调用你的实现assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {assert nums[i] == expectedNums[i];
}
如果所有的断言都通过,你的解决方案将会 通过。

题目实例

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

解题思路

快慢指针,两个指针都从下标0开始。
快的指针负责遍历原始数组,每次+1。
慢的指针负责统计真实长度,当满足条件(快指针指向的小标 != 目标值)时,先把不满足的值赋给当前慢指针的下标,然后+1。
当快指针遍历结束时,此时的慢指针的长度就是期待的值。

举个栗子:
例如 3 2 2 3,目标值是3
快指针 为0,如果表示下标则指向3 ,慢指针不动,值还是0
快指针 为1,如果表示下标则指向2 ,满足不等于目标值,先给慢指针的当前值(0)对应的num[0] 赋值2,然后慢指针向后移动,慢指针变成1
快指针 为2,如果表示下标则指向2 ,满足不等于目标值,先给慢指针的当前值(1)对应的num[1] 赋值2,然后慢指针向后移动,慢指针变成2
快指针 为3,如果表示下标则指向3,慢指针不动,值还是2
数组遍历结束,返回慢指针的值2,也就是只有两个元素符合条件。

补充说明: 之所以用 “快指针 为0,如果表示下标则指向3” 是因为这个不完全是数组的下标,只是可以这样理解,因为实际场景的话,新数组的长度是2,下标2都越界了。

代码实现

    public int removeElement(int[] nums, int val) {// 慢指针int slowIndex = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != val) {// 也可以写成 slowIndex++nums[slowIndex] = nums[i];slowIndex++;}}return slowIndex;}

tips: 实际开发中,不要用i这样的表示,要有业务意义。

26. 删除有序数组中的重复项

力扣地址

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

题目描述

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
判题标准:系统会用下面的代码来测试你的题解:int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案int k = removeDuplicates(nums); // 调用assert k == expectedNums.length;
for (int i = 0; i < k; i++) {assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。

题目示例

示例 1:输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

解题思路

有序,所以一样的一定在一起。
快慢指针
初始状态:慢指针为0,快指针为1
进行状态:当快慢指针指向的值不一致时,慢指针先加1,然后再赋值这个加一以后的位置的值。上一个题目是从慢指针开始一个一个填充不等于目标值的,这个是最开始的那一位就是需要的,然后才要筛选每一个不一样的。
结束状态:快指针遍历结束,返回慢指针 + 1,数组是从0开始的,长度要+1。

栗子:
1,1,2
初始状态:
快指针1,指向的值是1
慢指针0,指向的值是1
进行状态:
快指针+1,变成2,指向的值是2
慢指针是0,指向1,值不一样,慢指针先+1,变成1,然后1这个位置的值赋值2
结束状态:
返回长度,慢指针1,+1是2

代码实现

    public int removeDuplicates(int[] nums) {// 建议做个保护,实际你不知道别人会不会调你的方法,万一有问题,防止甩锅if (nums == null || nums.length == 0) {return 0;}int slowIndex = 0;for (int fastIndex = 1; fastIndex < nums.length; fastIndex++) {if (nums[fastIndex] != nums[slowIndex]) {slowIndex++;nums[slowIndex] = nums[fastIndex];}}return slowIndex + 1;}

283. 移动零

力扣地址

https://leetcode.cn/problems/move-zeroes/description/

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

题目实例

示例 1:输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

解题思路

这个和27是一样的,可以理解成目标值是0,然后把不等于0的全部塞完以后,这个时候的慢指针从结束位置一直填充0。

代码实现

    public void moveZeroes(int[] nums) {int index = 0;for (int i = 0;  i < nums.length; i++) {if (nums[i] != 0) {nums[index++] = nums[i];}}// 上面和27完全一样,下面就一点点变种for (int i = index; i < nums.length; i++) {nums[i] = 0;}}

tips:实际开发中,不要把对象塞在一个void方法里,否则你压根不知道会改点什么东西,和对象有关的要放在初始化里,如果涉及状态改变,将这个对象建模成领域实体,再把状态改变的方法定义在领域实体中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字驱动:企业发展的火箭助推器!

​ 在这个数字经济时代&#xff0c;数据就像火箭燃料&#xff0c;而数字驱动则是那强大的火箭助推器&#xff01;它正以惊人的力量助力企业飞速发展&#xff01; 数字驱动&#xff0c;助力企业发展的超强引擎&#xff01; 用数据说话&#xff0c;决策不再盲目&#xff01; 以数…

Vue CLI 环境变量使用指南

一、简介 Vue CLI 是一个强大的前端工程化工具&#xff0c;它提供了丰富的配置选项&#xff0c;包括环境变量的管理。环境变量允许开发者根据不同的运行环境&#xff08;如开发、测试和生产&#xff09;应用不同的配置&#xff0c;而无需更改代码。本文将详细介绍如何在 Vue C…

redis 03 RDB AOF

1.数据库状态 2.为什么会出现RDB 3.什么是RDB 5.1 5.2 6 6.1 6.2 6.2.1 6.2.2 6.2.3 7 8. 8.1 9 9.1 9.2 9.3 9.4 9.5

心链12-----队伍页业务完善+匹配算法实现随机匹配(最短距离算法)

心链 — 伙伴匹配系统 搜索队伍 我们选择vant组件库里的基础搜索框&#xff0c;复制到TeamPage页面&#xff0c;同时还有查询为空时&#xff0c;显示的无结果页面&#xff08;用户页面以写过&#xff09; 因为&#xff0c;我们一次性挂载本质性也是搜索队伍&#xff0c;所以…

@Validated 前端表单数据校验

1. 整合 1.1 依赖引入 <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>1.2 控制层 /*** 新增胎架计划** param subsectionPlanVo* return*/PostMapping("/sched…

数据结构复习指导之外部排序

目录 外部排序 复习提示 1.外部排序的基本概念 2.外部排序的方法 2.1对大文件排序时使用的排序算法&#xff08;2016&#xff09; 3.多路平衡归并与败者树 4.置换-选择排序&#xff08;生成初始归并段&#xff09; 4.1置换-选择排序生成初始归并段的实例(2023) 5.最佳…

【经验】Ubuntu上离线安装VsCode插件浏览Linux kernel源码

1、下载VsCode离线安装包 1.1 下载 下载地址:https://marketplace.visualstudio.com/vscode 本人安装的插件: C/C++ checkpatch Chinese clangd kconfig Makefile Tools Perl Perl Toolbox注意:C/C++插件要安装Linux 64版本 1.2 安装 将离线安装包拷贝到Ubuntu中,执…

SpringCloud整合OpenFeign实现微服务间的通信

1. 前言 1.1 为什么要使用OpenFeign&#xff1f; 虽说RestTemplate 对HTTP封装后, 已经⽐直接使⽤HTTPClient简单⽅便很多, 但是还存在⼀些问题. 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错. 代码可读性差, ⻛格不统⼀。 1.2 介绍一下微服务之间的通信方式 微…

使用 stress 命令进行Linux CPU 压力测试

大家好&#xff0c;在现代计算机系统中&#xff0c;对系统性能和稳定性的评估是至关重要的。特别是在服务器环境中&#xff0c;我们需要确保系统能够在高负载情况下稳定运行&#xff0c;以满足用户的需求。而 CPU 是系统中最关键的组件之一&#xff0c;其性能直接影响着整个系统…

Python 快速查找并替换Excel中的数据

Excel中的查找替换是一个非常实用的功能&#xff0c;能够帮助用户快速完成大量数据的整理和处理工作&#xff0c;避免手动逐一修改数据的麻烦&#xff0c;提高工作效率。要使用Python实现这一功能&#xff0c; 我们可以借助Spire.XLS for Python 库&#xff0c;具体操作如下&am…

GAN网络理论和实验(二)

文章目录 一、说明二、什么是生成对抗网络&#xff1f;三、判别模型与生成模型四、生成对抗网络的架构五、你的第一个 GAN六、准备训练数据七、实现鉴别器八、实现生成器九、训练模型十、检查 GAN 生成的样本十一、使用 GAN 生成手写数字十二、准备训练数据十三、实现鉴别器和生…

笔记-2024视频会议软件技术选型方案

一、背景 视频会议系统是一种现代化的办公系统&#xff0c;它可以使不同会场的实时现场场景和语音互连起来&#xff0c;同时向与会者提供分享听觉和视觉的空间&#xff0c;使各与会方有“面对面”交谈的感觉。随着社会的发展&#xff0c;视频会议的应用越来越广泛&#xff0c;…

BC6 小飞机

BC6 小飞机 废话不多说先上题目&#xff1a; 代码如下&#xff1a; #include<stdio.h> int main() {printf(" ## \n############\n############\n # # \n # # \n");return 0; }这是用一个printf打印我们还可以用多个printf发打印代码如下…

Django框架中级

Django框架中级 – 潘登同学的WEB框架 文章目录 Django框架中级 -- 潘登同学的WEB框架 中间件自定义中间件常用中间件process_view() 使用中间件进行URL过滤 Django生命周期生命周期分析 Django日志日志配置filter过滤器自定义filter 日志格式化formatter Django信号内置信号定…

Ansible——setup模块

目录 主要用途 参数总结 语法示例 1. 收集所有主机的信息 2. 过滤特定信息 3. 列出所有内存信息 4. 收集特定变量的信息 5. 使用 gather_subset Playbook示例 基本语法 使用示例 1. 基本使用 2. 使用 gather_subset 参数 3. 使用 filter 参数 4. 使用 register 捕…

笔记:Mysql的安全策略

1&#xff0c;安装安全插件 1.检查是否已安装该插件 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME validate_password;2.安装插件 INSTALL PLUGIN validate_password SONAME validate_password.so;3.修改配置文件 vi /etc/my.cn…

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…

【纯血鸿蒙】——响应式布局如何实现?

前面介绍了自适应布局&#xff0c;但是将窗口尺寸变化较大时&#xff0c;仅仅依靠自适应布局可能出现图片异常放大或页面内容稀疏、留白过多等问题。此时就需要借助响应式布局能力调整页面结构。 响应式布局 响应式布局是指页面内的元素可以根据特定的特征&#xff08;如窗口…

docker部署使用本地文件的fastapi项目

项目背景&#xff1a;项目使用python开发&#xff0c;需要使用ubutun系统部署后端api接口&#xff0c;对外使用8901端口。 1:项目结构&#xff1a; 2&#xff1a;项目需要使用的pyhton版本为3.9&#xff0c;dockerfile内容如下&#xff1a; # FROM python:3.9# WORKDIR /co…

自制植物大战僵尸:HTML5与JavaScript实现的简单游戏

引言 在本文中&#xff0c;我们将一起探索如何使用HTML5和JavaScript来创建一个简单的植物大战僵尸游戏。这不仅是一项有趣的编程挑战&#xff0c;也是学习游戏开发基础的绝佳机会。 什么是植物大战僵尸&#xff1f; 植物大战僵尸是一款流行的策略塔防游戏&#xff0c;玩家需…