代码随想录算法打卡 Day2

数组 - 双指针法(用于移除元素)

27.移除元素

快指针:寻找新数组的元素
慢指针:指向更新新数组下标的位置
代码实现为:
class Solution {
    public int removeElement(int[] nums, int val) {
        int slowIndex = 0;
        //注意题目要求不使用额外数组空间!而是原地移除!
        for(int fastIndex = 0;fastIndex<nums.length;fastIndex++){
            if(nums[fastIndex]!=val){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}

26.删除有序数组中的重复项

代码实现为:

class Solution {
    public int removeDuplicates(int[] nums) {
        //题目条件:有序数组
        //题目要求:原地删除
        int slowIndex = 0;
        for(int fastIndex=0;fastIndex<nums.length;fastIndex++){
            while(nums[fastIndex]!=nums[slowIndex]){
                nums[slowIndex+1] = nums[fastIndex];
                slowIndex++;
            }
        }
        //要返回的k为元素数量,而slowIndex代表索引,故最后返回的值应该+1
        return slowIndex+1;
    }
}

283.移动零

别忘了最后补零操作

class Solution {
    public void moveZeroes(int[] nums) {
        //原地操作
        int slowIndex = 0;
        for(int fastIndex = 0;fastIndex<nums.length;fastIndex++){
            if(nums[fastIndex]!=0){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        //把0补齐
         for(int i = slowIndex;i<nums.length;i++){
            nums[i] = 0;
         }
        
    }
}

844.比较含退格的字符串

代码实现为:

class Solution {
    public boolean backspaceCompare(String s, String t) {
        int skipS = 0 , skipT = 0;
        //利用字符串中的length()方法可知字符串的长度
        //长度别忘了减1,否则会造成越界
        int i = s.length()-1, j = t.length()-1;
        while(i>=0 || j>=0){
            while(i>=0){
                if(s.charAt(i)=='#'){
                    skipS++;
                    i--;
                }else if(skipS>0){
                    //退格,即跳过要删除的元素
                    i--;
                    skipS--;
                }else{
                    break;
                }
            }
            while(j>=0){
                if(t.charAt(j)=='#'){
                    skipT++;
                    j--;
                } else if(skipT>0){
                    j--;
                    skipT--;
                }else{
                    break;
                }
            }
            if(i>=0 && j>=0){
                if(s.charAt(i)!=t.charAt(j)){
                    return false;
                }
            }else{
                if(i>=0 || j>=0){
                return false;
                } 
            }
            i--;
            j--;
        }
        return true;
    }
}

977.有序数组的平方

代码实现为:

class Solution {
    public int[] sortedSquares(int[] nums) {
        //注意题目条件:非递减数组,可以粗略理解为递增数组,则平方最大的数一定在数组首部或尾部
        int left = 0 , right = nums.length-1;
        int[] ans = new int[nums.length];
        int i = nums.length-1;
        while(left<=right){
            if(nums[left]*nums[left]>=nums[right]*nums[right]){
                ans[i] = nums[left]*nums[left];
                left++;
            }else{
                ans[i] = nums[right]*nums[right];
                right--;
            }
            i--;
        }
        return ans;
    }
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值