算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/)

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

        解题思路:

        双指针算法:由于数组划分,数组滑块,采用数组下标来充当指针;

        依题意,需将数组划分为非零区域和零区域,且非零区域的数字排列顺序与之前相对不变;

         定义cur和dest两个指针:

cur:从数组的0的下标开始扫描,一直到nums.length-1的位置;

dest:从下标为-1的位置开始扫描,将整个数组分为已处理区和未处理区;

        举例说明:

        此时如下图所示:

        cur向前一步,

        判断,如果当前cur所指为零,则接着向前一步,如果所指非零,则dest指针往前一步,此时的两个位置的数值进行交换,如下所示,持续上述步骤;

综上所述,代码如下:

class Solution {public void moveZeroes(int[] nums) {for(int cur=0,dest = -1;cur < nums.length;cur ++){if(nums[cur] != 0){dest ++;//交换cur和destint temp = nums[cur];nums[cur] = nums[dest];nums[dest] = temp;}}}
}

2、[1089. 复写零](https://leetcode.cn/problems/duplicate-zeros/)

        给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

        注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

        由题意可得,需要采用双指针的方法;

        因为是要保持原数组长度的前提下,从前往后需要进行改写数组,所以我们需要找到最后一个被复写的数字,从后往前按照规则复写;

步骤一:先找到最后一个复写的数

        1、先判断cur位置上的数值是否为0;

                如果为0,dest指针先前移动两步;

                如果不为0,dest指针先前移动一步;

        2、找到当前循环的结束点;

                dest指针在(0,n-1)范围内是,该循环继续,所以当dest指针>=n-1时,当前循环结束;

        3、所以在循环未结束前,dest指针向前移动后,不能结束终止循环,则cur指针向前一步;

        综上所述,cur指针最后所指的位置的数字就是我们要复写的最后一个数字;

步骤二:处理关于dest指针在上述循环结束后的边界条件;

        在找到最后一个复写数字的时候莫过于两种情况;

情况一:dest指针在n-1位置上,此为正常状态;

情况二:dest指针由于规则,+2之后回停在n+1位置上,此为非正常状态,需要特殊处理;

        我们需要在dest+2,cur+1,操作(此时存在数组越界)的情况下,dest-2,cur-1,arr【n-1】=0操作处理;

步骤三:从后往前复写0操作;

        

代码如下:

class Solution {public void duplicateZeros(int[] arr) {int cur = 0,dest = -1,n = arr.length;// 1. 先找到最后⼀个需要复写的数while(cur < n ){if(arr[cur] != 0){dest +=1;}else{dest +=2;}if(dest >= n-1){break;}cur ++;}// 2. 处理⼀下边界情况if(dest == n) {arr[n-1] = 0;dest -=2;cur--;}// 3. 从后向前完成复写操作while(cur >= 0){if(arr[cur] != 0) {arr[dest--] = arr[cur--];} else {arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
}

 ps:如果对你有所帮助的话就请意见三连哦!!!

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

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

相关文章

Redis——入门简介

Redis&#xff0c;全称为Remote Dictionary Server&#xff0c;即远程字典服务&#xff0c;是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件&#xff0c;具备出色的读写性能和丰富的功能特性。以下是对Redis的入门简介&#xff1a; 一、Redis的主…

LVM逻辑卷管理之快照 —— 筑梦之路

简介 LVM快照是LVM提供的一个强大功能&#xff0c;它允许我们在不中断服务的情况下捕获逻辑卷在某个时间点的状态&#xff0c;从而进行备份、恢复或测试等操作。LVM快照是一个特殊的逻辑卷&#xff0c;它保存了原始逻辑卷在某个时间点的数据镜像。快照使用写时复制&#xff08…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…

Ubuntu 24.04 LTS 安装 touchegg 开启触控板多指手势

文章目录 〇、概述一、安装 touchegg二、安装 gnome-shell 扩展 X11 Gestures三、安装可视化配置工具 touche 〇、概述 之前为了让笔记本支持多指手势&#xff0c;我安装的是 fusuma&#xff0c;安装教程详见 这篇文章 &#xff0c;考虑到 fusuma 安装过程繁琐且不支持可视化配…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

linux 设备驱动支持多个设备写法

compatible “aaa,bbb” 当一个驱动支持多个设备的时候&#xff0c;在每个设备的dts中&#xff0c;都会配置各自的compatible&#xff0c;当与driver中的compatible匹配后&#xff0c;会取各自的data。在 __of_match_node中有match。 Example1 static const struct of_devi…

Docker与Consul:构建动态服务发现与更新的微服务体系

Docker和Consul是构建微服务体系中常用的工具之一&#xff0c;它们可以协同工作来实现动态服务发现和更新。下面是一个简单的Java微服务体系的示例&#xff0c;使用Docker容器和Consul进行服务的注册、发现和更新。 1. 创建一个简单的Java微服务 首先&#xff0c;我们创建一个…

1.4. 离散时间鞅-鞅的Lp收敛,鞅与停时 (2)

鞅的L^p收敛p > 1,鞅与停时 鞅的L^p收敛(p > 1),鞅与停时2. 极大值不等式2.1. Doob不等式-时间有界2.2. L p L^{p} L

MySQL主从切换测试

测试主从高可用 确认mha正常运行中ps -ef | grep mha #一般在kde-offline3节点 mysql 166898 1 1 17:54 pts/0 00:00:00 perl /bin/masterha_manager --conf=/data/apps/mha4mysql-manager-0.58/app13306.cnf --ignore_last_failover 如果未启动则需要手动执行mha…

数据结构之----栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表&#xff1b; 队列是只允许在一端进行插入操作&#xff0c;而另一端进行删除操作的线性表&#xff1b; 栈&#xff0c;允许插入和删除的一端称为栈顶&#xff0c;另一端称为栈底&#xff0c;特点后进先出。 插入操作称为进栈&#…

【全网首发】大模型入门、概念详解、综述

大模型教程 注NLP入门、大模型入门、NLP发展、NLP四范式、综述入门必读图像相关大模型相关微调相关多模态相关其他注 多数文章博主已经读完,有中文笔记、代码、私信博主领取也可以相互交流学习。笔记写在flowus中会逐渐迁移到博客。 NLP入门、大模型入门、NLP发展、NLP四范式…

for box,score,cat in zip(xywhboxes,scores,cats):

zip()函数可以将多个可迭代对象打包成一个元组序列&#xff0c;这些对象的元素会一一对应&#xff0c;例如&#xff1a; a [1, 2, 3] b [a, b, c] c zip(a, b) print(list(c)) 输出为 [(1, a), (2, b), (3, c)] for循环中的zip()函数将它们打包成一个元组序列&#xff0…

Android中C++如何读写json文件

我们需要在json文件中记录一下总数&#xff0c;文件格式如下&#xff1a; [{"total_count":0,"total_count1":0,"total_count2":0,"total_count3":0,"total_count4":0}] 目录 1. Android.bp中新增 2. 头文件添加 3. 向jso…

websocket和http协议的区别

ws(websocket)协议和http协议是两种不同的协议。 http&#xff1a;http是一种用于传输超文本的应用层协议&#xff0c;通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的&#xff0c;但是HTTP只能在同一时刻单向发送消息&#xff0c;是一种半双工通信。&#…

ISIS学习二——与OSPF相比的ISIS报文以及路由计算

目录 一.ISIS支持的网络类型 1.OSPF支持 2.ISIS支持 二.ISIS最优路径的选取 &#xff08;1&#xff09;.ISIS开销值设置 1.全局开销 2.接口开销 3.根据带宽设置开销 &#xff08;2&#xff09;.ISIS的次优路径 三.ISIS报文格式 1.ISIS专用报头——TLV 2.ISIS通用头…

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】 题目描述&#xff1a;解题思路一&#xff1a;处理垃圾和路程单独计算。解题思路二&#xff1a;逆向思维&#xff0c;计算多走的路解题思路三&#xff1a;只记录&#xff0c;当前t需要计算几次 题目描述&#xff1a;…

SAF文件选择、谷歌PhotoPicker图片视频选择与真实路径转换

一、构建选择文件与回调方法 //文件选择回调ActivityResultLauncher<String[]> pickFile registerForActivityResult(new ActivityResultContracts.OpenDocument(), uri->{if (uri ! null) {Log.e("cxy", "返回的uri:" uri);Log.e("cxy&q…

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

直接看实验数据和结果: 代码: from sklearn import preprocessing import random from sklearn.m

持续总结中!2024年面试必问 100 道 Java基础面试题(四十二)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;四十一&#xff09;-CSDN博客 八十三、如何判断一个对象是否应该被垃圾回收&#xff1f; 在Java中&#xff0c;判断一个对象是否应该被垃圾回收的关键在于对象的引用状态。垃圾…

C# 调用 winmm.dll 播放 midi 文件

在C#中调用 winmm.dll&#xff08;Windows Multimedia Library&#xff09;来播放 MIDI 文件通常涉及使用mciSendString 函数&#xff0c;该函数是 winmm.dll 中提供的一个函数&#xff0c;用于发送 MCI&#xff08;Media Control Interface&#xff09;命令给MCI设备。 但是&…