2021-10-21每日刷题打卡

一、LeetCode:844. 比较含退格的字符串

(1)题目描述

        

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。

如果相等,返回 true ;否则,返回 false 。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。
示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 “”。
示例 3:

输入:s = "a##c", t = "#a#c"
输出:true
解释:s 和 t 都会变成 “c”。
示例 4:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 “c”,但 t 仍然是 “b”。

(2)题目分析

        考虑分别在两个字符串的后边用两个指针,从后往前遍历,也就是两个指针自减,但是题目中要求如果碰到#号则会退格,所以还要考虑设置两个临时变量纪录#号 如果#大于0则自减.最后比较剩下的两个代码是否相同。

(3)代码实现

        

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        int i = S.length() - 1, j = T.length() - 1;
        int skipS = 0, skipT = 0;

        while (i >= 0 || j >= 0) {
            while (i >= 0) {
                if (S[i] == '#') {
                    skipS++, i--;
                } else if (skipS > 0) {
                    skipS--, i--;
                } else {
                    break;
                }
            }
            while (j >= 0) {
                if (T[j] == '#') {
                    skipT++, j--;
                } else if (skipT > 0) {
                    skipT--, j--;
                } else {
                    break;
                }
            }
            if (i >= 0 && j >= 0) {
                if (S[i] != T[j]) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            i--, j--;
        }
        return true;
    }
};

二、LeetCode:986. 区间列表的交集

(1)题目描述

        

给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。

返回这 两个区间列表的交集 。

形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。

两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3] 。

示例 1:


输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
示例 2:

输入:firstList = [[1,3],[5,9]], secondList = []
输出:[]
示例 3:

输入:firstList = [], secondList = [[4,8],[10,12]]
输出:[]
示例 4:

输入:firstList = [[1,7]], secondList = [[3,10]]
输出:[[3,7]]


(2)题目分析

        这道题做的时候并没有什么思路,看完题解后我发现我真是个伞兵,首先用数学函数比较区间端点的大小,如果左侧大右侧小则添加到集合中,直至到达数组长度的尽头。

(3)代码实现

        

class Solution {
  public int[][] intervalIntersection(int[][] A, int[][] B) {
    List ans=new ArrayList();
    int i=0,j=0;
    while(i

三、LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置

(1)题目描述

        

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
 

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]
 

(2)题目分析

        这道题使用二分法查找做的,在了解二分法查找的时候我并不知道左边界右边界如何查找,这道题教会了我,如果找左边界需要从右往左缩小,查找右边界则需要从左向右扩大.

(3)代码实现

        

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res=new int[] {-1,-1};
        res[0]=binarySearch(nums,target,true);
        res[1]=binarySearch(nums,target,false);
       return res;
    }
    public int binarySearch(int[] nums, int target, boolean leftOrRight) {
        int res=-1;
        int left=0,right=nums.length-1,mid;
        while(left<=right){
            mid=left+(right-left)/2;
            if(nums[mid]target){
                right=mid-1;
            }else{
                res=mid;
                if(leftOrRight){
                    right=mid-1;
                }else{
                    left=mid+1;
                }
            }
        }
        return res;
    }
}

你可能感兴趣的:(算法,leetcode,算法,职场和发展)