算法通关村第三关|白银|双指针妙用【持续更新】

1.删除元素

1.1 原地删除等于 val 的元素

1.1.1 快慢双指针。

public int removeElement(int[] nums, int val) {int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] != val) {nums[slow] = nums[fast];slow++;}}return slow;
}

1.1.2 对撞双指针:用右边不是 val 的元素替换掉左边等于 val 的元素。

public int removeElement(int[] nums, int val) {int right = nums.length - 1;int left = 0;for (left = 0; left <= right; ) {if ((nums[left] == val) && (nums[right] != val)) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;}if (nums[left] != val) {left++;}if (nums[right] == val) {right--;}}return left;
}

1.1.3 对撞双指针+覆盖:左边等于 val 的时候,直接用右边的数覆盖左边的数。发生覆盖操作的时候 left 不移动,确保从 right 得到的值不为 val 的时候 left 才继续右移。

public int removeElement(int[] nums, int val) {int right = nums.length - 1;for (int left = 0; left <= right; ) {if (nums[left] == val) {nums[left] = nums[right];right--;} else {left++;}}return right + 1;
}

1.2 删除有序数组中的重复项

1.2.1 双指针,重复项保留一个。

public int removeDuplicates(int[] nums) {int slow = 1;for (int fast = 1; fast < nums.length; fast++) {if (nums[fast] != nums[slow - 1]) {nums[slow] = nums[fast];slow++;}}return slow;
}

1.2.2 重复项保留两个。

public int removeDuplicates(int[] nums) {int slow = 2;for (int fast = 2; fast < nums.length; fast++) {if (nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast];slow++;}}return slow;
}

*1.2.3 重复项保留K个。

// 由前两个例子已经得到了模板了
// k可以是0个,1个,2个,3个...
public int removeDuplicates(int[] nums, int k) {int slow = k;for (int fast = k; fast < nums.length; fast++) {if (nums[fast] != nums[slow - k]) {nums[slow] = nums[fast];slow++;}}return slow;
}

2.元素奇偶移动

2.1 对撞双指针。

public int[] sortArrayByParity(int[] A) {int left = 0, right = A.length - 1;while (left < right) {if (A[left] % 2 > A[right] % 2) {int temp = A[left];A[left] = A[right];A[right] = temp;}if (A[left] % 2 == 0) {left++;}if (A[right] % 2 == 1) {right--;}}return A;
}

3.数组轮转

3.1 将数组元素向右轮转 k 个位置:两轮翻转,先将整个数组翻转,再从 k 处分隔成两个部分分别翻转。

public void rotate(int[] nums, int k) {k %= nums.length;reverse(nums, 0, nums.length - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.length - 1);
}public void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start += 1;end -= 1;}
}

4.数组的区间

4.1 返回恰好覆盖数组中所有数字的区间:双指针,快指针遍历,慢指针到了不连续的地方再移动。

public List<String> summaryRanges(int[] nums) {List<String> res = new ArrayList<>();int slow = 0;for (int fast = 0; fast < nums.length; fast++) {// 先判断是不是最后一个,不是的话再判断跟后边的数是否连续if (fast + 1 == nums.length || nums[fast] + 1 != nums[fast + 1]) {// 是最后一个或者不是连续的话就将该段范围写入结果,并且移动slowStringBuilder sb = new StringBuilder();sb.append(nums[slow]);if (slow != fast) {sb.append("->").append(nums[fast]);}res.add(sb.toString());slow = fast + 1;}}return res;
}

4.2 返回缺失的区间:【持续更新】。

5.字符串替换空格

5.1 用指定字符串替换空格:先找到字符串中空格的个数,确定新字符串长度,slow指向末尾处,fast向前遍历,将字符赋给slow指向的地方,然后slow向前移动。

// 这里将空格被替换为"%20"
public String replaceSpace(StringBuffer str) {if (str == null) {return null;}int numOfblank = 0;// 原字符串长度int len = str.length();// 遍历计算空格数量for (int i = 0; i < len; i++) {if (str.charAt(i) == ' ') {numOfblank++;}}// 设置字符串新的长度str.setLength(len + 2 * numOfblank);// 原字符串最后一位int fast = len - 1;int slow = len + 2 * numOfblank - 1;// 如果slow追上了fast,说明空格已经被替换完了,前边的不需要再动了,直接结束循环while (fast >= 0 && slow > fast) {char c = str.charAt(fast);if (c == ' ') {fast--;str.setCharAt(slow--, '0');str.setCharAt(slow--, '2');str.setCharAt(slow--, '%');} else {fast--;str.setCharAt(slow--, c);}}return str.toString();
}

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤

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

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

相关文章

嘴笨的技术人员怎么发言

对于嘴笨的人来说&#xff0c;即兴发言简直就是灾难&#xff0c;想想自己窘迫的模样&#xff0c;自己都受不了&#xff0c;但职场又避免不了这种场合&#xff0c;所以&#xff0c;就要靠一些技巧让我们顺利打开思路了。 那么&#xff0c;今天就分享几个解救过我的不同场景即兴发…

数据结构介绍与时间、空间复杂度

数据结构介绍 什么是数据结构&#xff1f;什么是算法&#xff1f;数据结构和算法的重要性 数据结构定义 数据结构是计算机科学中研究数据组织、存储和管理的一门学科。数据结构描述了数据对象之间的关系&#xff0c;以及对数据对象进行操作的方法和规则。 常见的数据结构 数…

解析G代码【C#】

下面是一个使用C#编写的解析G代码的示例方法&#xff1a; 下面是一个使用C#编写的解析G代码的示例方法&#xff1a;csharp using System; using System.Collections.Generic;public class GCodeParser {public static List<GCodeCommand> ParseGCode(string gcode){var …

网络原理之TCP/IP

文章目录 应用层传输层UDP协议TCP协议TCP 的工作机制1. 确认应答2. 超时重传3. 连接管理TCP 的建立连接的过程(三次握手),和断开连接的过程(四次挥手)TCP 断开连接, 四次挥手 3. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 面向字节流10. 异常情况 本章节主要讨论…

【Python机器学习】零基础掌握SimpleImputer缺失值填充

如何处理数据集中的缺失值,以便更准确地进行数据分析或模型训练? 在数据分析和机器学习中,数据的完整性和准确性至关重要。但现实情况是,收集到的数据往往存在缺失值。例如,医疗研究中可能缺少某些患者的体重、年龄或血压等信息。这样的缺失值会对数据分析或模型训练产生…

vscode不显示横滚动条处理

最近发现vscode打开本地文件不显示水平的滚动条&#xff0c;但是打开一个临时文件是有水平滚动条的。 解决方案 可以一个个试 vscode配置 左下角设置–设置–搜索Scrollbar: Horizontal auto 自动visible 一直展示hidden 一直隐藏 拖动底部状态栏 发现是有的&#xff0c;但是…

国际腾讯云直播推流配置教程!

云直播的服务本质是一个广播的过程&#xff0c;类似于电视台的直播节目通过有线电视网发送给千家万户。为了完成这个过程&#xff0c;云直播需要有采集和推流设备&#xff08;类似摄像头&#xff09;、云直播服务&#xff08;类似电视台的有线电视网&#xff09;和播放设备&…

华为机试题:HJ3 明明的随机数

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…

1818_ChibiOS的计数信号量

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 之前见过计数信号量&#xff0c;也是在FreeRTOS中看到的。也看到过这样的功能在驱动设计中的应用&#xff0c;但是当时没有理解这个使用的方式。 1.…

ChIP实验简介

ChIP实验简介 一、ChIP实验的作用 染色质免疫沉淀(ChIP)是研究体内蛋白质-DNA相互作用的一种有价值的方法&#xff0c;鉴定各种DNA相互作用蛋白(如转录因子和调节因子、修饰组蛋白和表观遗传修饰因子)的结合位点和模式是必不可少的。来自组织或培养细胞的交联(XChIP)或天然(NC…

由于找不到emp.dll无法继续执行此代码问题的五个解决方法

在玩游戏的过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到emp.dll”&#xff0c;这个问题我们的游戏无法启动运行。本文将分享我在解决这一问题过程中的方法&#xff0c;希望能对遇到类似问题的玩家有所帮助。 emp.dll是一个动态链接库文件…

python实现ModBusTCP协议的server

python实现ModBusTCP协议的server是一件简单的事情&#xff0c;只要通过pymodbus、pyModbusTCP等模块都可以实现&#xff0c;本文采用pymodbus。 相关文章见&#xff1a; python实现ModBusTCP协议的client-CSDN博客 一、了解pymodbus的Server 1、pymodbus.server的模块 pym…

【JAVA学习笔记】48 - 八大常用Wrapper类(包装类)

一、包装类 1.针对八种基本定义相应的引用类型一包装类 2.有了类的特点&#xff0c;就可以调用类中的方法。 黄色背景的表示父类是Number 二、包装类和基本数据的转换 演示包装类和基本数据类型的相互转换&#xff0c;这里以int和Integer演示。 1.jdk5前的手动装箱和拆箱方…

逆向第一课---安装ADB工具,并使用夜神模拟器连接

1、安装ADB 如果安装了Android SDK可以直接去android_sdk/platform-tools/目录下使用ADB命令。 如果没有安装Android SDK&#xff0c;需要先通过下面的地址下载ADB https://adbdownload.com/ 根据自己的系统点击下载&#xff0c;我这里使用Windows系统&#xff0c;所以下载Wi…

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…

安装clang

安装clang: scanscan-virtual-machine:~$ clang -v Ubuntu clang version 14.0.0-1ubuntu1.1 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11 Selected GCC installatio…

【pytorch】torch.gather()函数

dim0时 index[ [x1,x2,x2],[y1,y2,y2],[z1,z2,z3] ]如果dim0 填入方式为&#xff1a; index[ [(x1,0),(x2,1),(x3,2)][(y1,0),(y2,1),(y3,2)][(z1,0),(z2,1),(z3,2)] ]input [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ] # shape&#xff08;3,4&#xff09; input torch.…

Spring Security —漏洞防护—跨站请求伪造(CSRF)

在终端用户可以 登录 的应用程序中&#xff0c;必须考虑如何防止 跨站请求伪造&#xff08;CSRF&#xff09;。 Spring Security 默认为 不安全的HTTP方法&#xff08;如POST请求&#xff09;提供CSRF攻击防护&#xff0c;因此无需额外代码。你可以使用下面的方法明确指定默认…

【Html】交通灯问题

效果 实现方式 计时器&#xff1a;setTimeout或setInterval来计时。setInterval和 setTimeout 在某些情况下可能会出现计时不准确的情况。这通常是由于JavaScript的事件循环机制和其他代码执行所需的时间造成的。 问询&#xff1a;通过getCurrentLight将每个状态的持续时间设置…

【纯离线】Ubuntu离线安装ntp时间同步服务

Ubuntu离线安装ntp服务 准备阶段&#xff1a;下载安装包 apt-get download ntp apt-get download ntpdate 一、服务端( 192.166.6.xx) 1、环境准备 先判断是否已安装 systemd-timesyncd systemctl is-active systemd-timesyncd 如果返回结果是 active&#xff0c;则表示…