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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值