2.移除元素,双指针解法。快慢指针进行判断,
int slow = 0;
for(int fast = 0; fast < nums.length; fast++){
}
第一题,移除元素:力扣27
快指针负责遍历数组元素,如果不等于目标,就放到慢指针中。
class Solution {
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;
}
}
第二题,删除有序数组中的重复项:力扣26
这个题跟上个题差不多,都是这样做。但是判断时需要注意,数组里是有序的,不等于前一个数就可以了
class Solution {
public int removeDuplicates(int[] nums) {
int slow = 1;
for(int fast = 1; fast < nums.length; fast++){
if(nums[fast] != nums[fast-1]){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
第三题,移动零:力扣283
这个题与上面的题型也差不多,但是需要进行二次循环,把后面的0补上
class Solution {
public void moveZeroes(int[] nums) {
int slow = 0;
for(int fast = 0 ; fast < nums.length; fast ++){
if(nums[fast] != 0){
nums[slow] = nums[fast];
slow++;
}
}
for(int fast = slow; fast< nums.length;fast++){
nums[fast] = 0;
}
}
}
第四题,比较含退格的字符串:力扣844
这个题的题型也跟上面的相似,只是多加了一个退格的判断。这个很容易实现,只要不符合条件就可以视为退格。
class Solution {
public boolean backspaceCompare(String s, String t) {
return cs(s).equals(cs(t));
}
private String cs(String str){
char[] nums = str.toCharArray();
int slow = 0;
for(int fast = 0 ; fast < nums.length ; fast++){
if(nums[fast] != '#'){
nums[slow] = nums[fast];
slow++;
}else{
if(slow != 0){
slow--;
}
}
}
return String.valueOf(nums, 0 ,slow);
}
}
第五题,有序数组的平方:力扣977
这个题可以使用上面的做法,然后再sort。这里采用的是别的做法。左边和右边的数都会比中间大,思路是利用新开数组的右边存放最大值。如果左边的数比右边的大,就放进新开的数组的右边,然后向前移动一位;否则就移动右边。这个题的解法与移除元素的思路有点不同
class Solution {
public int[] sortedSquares(int[] nums) {
int l = 0, r = nums.length -1;
int[] res = new int[nums.length];
int index = res.length - 1;
while(l <= r){
if(nums[l] * nums[l] > nums[r] * nums[r]){
res[index] = nums[l] * nums[l];
index--;
l++;
}
else{
res[index] = nums[r] * nums[r];
index--;
r--;
}
}
return res;
}
}