【沉浸式求职学习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解决;
但是如果要求一些算法的话还是采用双指针。
两个指针,一个从左,一个从右,右边的指针负责从结尾向第一个元素变量,左边的指针负责从第一个元素向最后一个元素遍历。同时它俩作比较,如果右边的大,那么就给数组的最后一位赋这个更大的值,同时右边的指针左移,在和左边的指针比;如果右边的小,那么就把更大值赋给数组,同时左边的指针向右边移动。