LeetCode:比较含退格的字符串+有序数组的平方(双指针法进阶)

比较含退格的字符串

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

题目链接:力扣

思想

双指针法:采用双指针的思想,定义两个指针分别为fast和slow,fast用来遍历原数组,如果fast下标对应的字符不是'#'则将fast下标对应的字符赋值给slow下标对应的元素(slow从下标0开始),如果fast下标对应字符是'#'则需要让slow--(该操作会删除slow下标对应的字符元素),注意:对字符串的字符进行操作时需要先将字符串转换成字符数组:

public boolean backspaceCompare(String s, String t) {
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        int fast1 = 0;
        int fast2 = 0;
        int slow1 = 0;
        int slow2 = 0;
        for(fast1 = 0;fast1 < ch1.length;fast1++) {
            if(ch1[fast1] != '#') {
                ch1[slow1++] = ch1[fast1];
            } else {
                if(slow1 != 0) {
                    slow1--;
                }
            }
        }
        for(fast2 = 0;fast2 < ch2.length;fast2++) {
            if(ch2[fast2] != '#') {
                ch2[slow2++] = ch2[fast2];
            } else {
                if(slow2 != 0) {
                    slow2--;
                }
            }
        }
        String ret1 = new String(ch1,0,slow1);
        String ret2 = new String(ch2,0,slow2);
        return ret1.equals(ret2);
    }

注意:对slow进行--操作时需要先判断一下此时slow是否为0,如果为0则需要进行--操作,为0则不进行否则会造成数组越界!

有序数组的平方

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

题目链接:力扣

法一:使用库函数

将该数组的每一个元素进行平方的操作,再使用库函数对数组进行排序:

 public int[] sortedSquares(int[] nums) {
        for(int i = 0;i < nums.length;i++) {
            nums[i] = nums[i] * nums[i];
        }
        //使用库函数对数组进行排序
        Arrays.sort(nums);
        return nums;
    }

法二:使用排序算法(这里以冒泡排序为例)

将该数组的每一个元素进行平方的操作,再使用排序算法对数组进行排序(以冒泡排序为例):

    public int[] sortedSquares(int[] nums) {
        for(int i = 0;i < nums.length;i++) {
            nums[i] = nums[i] * nums[i];
        }
        
        //使用冒泡排序
        for(int i = 0;i < nums.length - 1;i++) {
            for(int j = 0;j < nums.length - 1 - i;j++) {
                if(nums[j] > nums[j+1]) {
                    int tmp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
        }
        return nums;
    }

发三:使用双指针

整个数组中若存在负数的话,则平方后的数组会呈现出先减小再增大的趋势,此时采用双指针的方法,定义一个新数组数组长度为原数组长度,并定义一个k指向新数组的最后一个元素,再分别定义一个slow指针指向数组的第一个元素,fast指针指向数组的最后一个元素,比较这两个指针所对应下标的元素,如果slow大于fast所对应元素将slow的值赋值给新数组的k下标处并且k--,否则将fast对应元素赋值给新数组的k下标处并且k--,循环终止的条件时i > j:

public int[] sortedSquares(int[] nums) {
        for(int i = 0;i < nums.length;i++) {
            nums[i] = nums[i] * nums[i];
        }
      
        //使用双指针
        int[] ret = new int[nums.length];
        int k = nums.length - 1;
        int i = 0;
        int j = nums.length - 1;
        for(i = 0,j = nums.length - 1;i <= j;) {
            if(nums[i] > nums[j]) {
                ret[k--] = nums[i];
                i++;
            } else {
                ret[k--] = nums[j];
                j--;
            }
        }
        return ret;
    }

注意:

  • 循环终止的条件是 i > j(i = j也要判断,否则会遗漏i = j时所对应下标的元素);
  • 定义的新数组是从数组的最后一个元素开始填充数据的,所以每进行一次填充都需要将k--。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值