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

【沉浸式求职学习day39】【双指针算法题】

沉浸式求职学习

  • 移除元素
  • 删除有序数组中的重复项
  • 比较含退格的字符串
  • 有效数组的平方

移除元素

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k
class Solution {public int removeElement(int[] nums, int val) {int left=0;for(int right=0;right<nums.length;right++){if(nums[right]!=val){nums[left] = nums[right];left++;}}return left;}
}

一个指针是left,另一个是right,right只负责遍历,如果查到nums[right]与你的目标值不同,就把这个值存给nums[left],最后返回Left的个数即可。

删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

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

我第一次做的时候犯了个错误
我返回了数组的length,所以报错了
要注意,我们只是移动了数组,并没有直接进行增删,所以要返回不重复元素的数目,也就是slow+1;

比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

class Solution {public boolean backspaceCompare(String s, String t) {char[] s1 = s.toCharArray();char[] s2 = t.toCharArray();return tuige(s1).equals(tuige(s2));}public String tuige(char[] s){int slow=0;int n = s.length;for(int right=0;right<n;right++){if(s[right] != '#'){s[slow] = s[right];slow++;}else{if(slow>0)slow--;  }}return new String(s,0,slow);}}

注意的两个地方:

  • slow-- 这里 一定要有个前置条件 如果slow>0,不然成负数了
  • 返回值,我最开始写的是s.toString(),但是数组中没重写toString方法,所以返回的是一个地址(类名+哈希码)
  • 然后针对返回值,我又用了Arrays.toString(s),发现还是报错,这是因为,**Arrays.toString(s)**返回的是一个数组的内容的字符串,假设我们数组是[a,b],它返回的字符串就是[a,b],而不是我们想要的ab。所以影响后续判断
  • 所以最好的方法就是new String(s),然后截取有效部分。

有效数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

class Solution {public int[] sortedSquares(int[] nums) {int slow=0;int n = nums.length;int[] new_nums = new int[n];int fast=n -1;for(int i=n-1;i>=0;i--){if(nums[fast]*nums[fast]>nums[slow]*nums[slow]){   new_nums[i] = nums[fast]*nums[fast];fast--;}else {new_nums[i] = nums[slow]*nums[slow];slow++;}}return new_nums;}
}

这个题可以采用一个for循环再加个sort解决;
但是如果要求一些算法的话还是采用双指针。
两个指针,一个从左,一个从右,右边的指针负责从结尾向第一个元素变量,左边的指针负责从第一个元素向最后一个元素遍历。同时它俩作比较,如果右边的大,那么就给数组的最后一位赋这个更大的值,同时右边的指针左移,在和左边的指针比;如果右边的小,那么就把更大值赋给数组,同时左边的指针向右边移动。

http://www.xdnf.cn/news/6186.html

相关文章:

  • 公链开发及其配套设施:钱包与区块链浏览器
  • 【Python】杂乱-[代码]Python 输出/打印列表(list)的方法
  • 三子棋设计
  • C#上位机RS485通信控制变频器
  • 3、ubantu系统docker常用命令
  • Centos 上安装Klish(clish)的编译和测试总结
  • NixOS 系统深度解析
  • Profibus DP主站转Modbus RTU/TCP网关接艾默生流量计与上位机通讯
  • Apache Pulsar 消息、流、存储的融合
  • 【Bootstrap V4系列】学习入门教程之 组件-导航条(Navbar)
  • MQTT详细介绍
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-A. PostgreSQL常用函数速查表
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能快递分拣机技术方案‌
  • 时序数据库IoTDB分布式系统监控基础概述
  • 小白成长之路-文件和目录内容检索处理(二)
  • 【C++重载操作符与转换】纯虚函数
  • 尚硅谷阳哥JVM
  • 智能工具协同赋能STEM教育科研|探索LLM大语言模型和数学软件Maple的创新实践
  • 2025年城市建设与交通运输国际会议(ICUCT 2025)
  • Baklib全场景知识中台驱动效能跃升
  • less中使用 @supports
  • 在C++中进行套接字编程时,主要使用以下头文件
  • CSS:选择器的优先级
  • 深入剖析某App视频详情逆向:聚焦sig3参数攻克
  • (10天冲刺版)软考:软件设计师 真题资料分享
  • Java高频面试之并发编程-17
  • 高海拔和远距离的人员识别:面部、体型和步态的融合
  • spark的Standalone模式介绍
  • 最大公约数JAVA
  • CK-S654-PA60一拖四分体式半导体电子货架专用RFID读写器|读码器接线使用说明