给定 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”。
考虑分别在两个字符串的后边用两个指针,从后往前遍历,也就是两个指针自减,但是题目中要求如果碰到#号则会退格,所以还要考虑设置两个临时变量纪录#号 如果#大于0则自减.最后比较剩下的两个代码是否相同。
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;
}
};
给定两个由一些 闭区间 组成的列表,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]]
这道题做的时候并没有什么思路,看完题解后我发现我真是个伞兵,首先用数学函数比较区间端点的大小,如果左侧大右侧小则添加到集合中,直至到达数组长度的尽头。
class Solution {
public int[][] intervalIntersection(int[][] A, int[][] B) {
List ans=new ArrayList();
int i=0,j=0;
while(i
给定一个按照升序排列的整数数组 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]
这道题使用二分法查找做的,在了解二分法查找的时候我并不知道左边界右边界如何查找,这道题教会了我,如果找左边界需要从右往左缩小,查找右边界则需要从左向右扩大.
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;
}
}