leetcode第 400 场周赛 学习笔记
(激动!摩拳擦掌!这是我第一次在力扣刷题)
3168.候诊室中的最少椅子数
题目
给你一个字符串 s,模拟每秒钟的事件 i:
如果 s[i] == ‘E’,表示有一位顾客进入候诊室并占用一把椅子。
如果 s[i] == ‘L’,表示有一位顾客离开候诊室,从而释放一把椅子。
返回保证每位进入候诊室的顾客都能有椅子坐的 最少 椅子数,假设候诊室最初是空的 。
示例 1:
输入:s = “EEEEEEE”
输出:7
解释:每秒后都有一个顾客进入候诊室,没有人离开。因此,至少需要 7 把椅子。
示例 2:
输入:s = “ELELEEL”
输出:2
解释:假设候诊室里有 2 把椅子。下表显示了每秒钟等候室的状态。
示例 3:
输入:s = “ELEELEELLL”
输出:3
解释:假设候诊室里有 3 把椅子。下表显示了每秒钟等候室的状态。
提示:
- 1 <= s.length <= 50
- s 仅由字母 ‘E’ 和 ‘L’ 组成。
- s 表示一个有效的进出序列。
题解
class Solution {
public int minimumChairs(String s) {
int count=0;
int num=0;
for(int i=0; i<s.length(); i++){
char c=s.charAt(i);
if(c=='E'){
count++;
num=Math.max(num,count);
}else if(c=='L'){
count--;
}
}
return num;
}
}
3169.无需开会的工作日
题目
给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。
返回员工可工作且没有安排会议的天数。
注意:会议时间可能会有重叠。
示例 1:
输入:days = 10, meetings = [[5,7],[1,3],[9,10]]
输出:2
解释:第 4 天和第 8 天没有安排会议。
示例2:
输入:days = 5, meetings = [[2,4],[1,3]]
输出:1
解释:
第 5 天没有安排会议。
示例3:
输入:days = 6, meetings = [[1,6]]
输出:0
解释:所有工作日都安排了会议。
题解
呜呜呜呜呜呜呜我的解法超出时间限制了
class Solution {
public int countDays(int days, int[][] meetings) {
char[] arr=new char[days];
for(int i=0;i<days;i++){
arr[i]='0';
}
String str=new String(arr);
StringBuffer strb=new StringBuffer(str);
for(int j=0;j<meetings.length;j++){
int s=meetings[j][0]-1;
int e=meetings[j][1]-1;
for(int k=s;k<=e;k++){
strb.replace(k,k+1,"1");
}
}
int cnt=0;
for(int m=0;m<strb.length();m++){
if(strb.charAt(m)=='0') cnt++;
}
return cnt;
}
}
这有点像穷举法。看看别人的解法吧!
class Solution {
public int countDays(int days, int[][] meetings) {
Arrays.sort(meetings, (p, q) -> p[0] - q[0]); // 按照左端点从小到大排序
int start = 1, end = 0; // 当前合并区间的左右端点
for (int[] p : meetings) {
if (p[0] > end) { // 不相交
days -= end - start + 1; // 当前合并区间的长度
start = p[0]; // 下一个合并区间的左端点
}
end = Math.max(end, p[1]);
}
days -= end - start + 1; // 最后一个合并区间的长度
return days;
}
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-days-without-meetings/solutions/2798193/zheng-nan-ze-fan-he-bing-qu-jian-pythonj-r0gi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
查漏补缺:Lambda表达式
(p, q) -> p[0] - q[0] 是一个Lambda表达式,它定义了一个比较器。在这个比较器中:
p 和 q 是 meetings 数组中的两个元素(即二维数组的行)。
p[0] 和 q[0] 分别表示这两个元素(即二维数组的行)的第一个元素。
p[0] - q[0] 计算了这两个元素的第一个值的差,并根据这个差来比较这两个元素。
3170.删除星号以后字典序最小的字符串
题目
给你一个字符串 s 。它可能包含任意数量的 *
字符。你的任务是删除所有的 *
字符。
当字符串还存在至少一个 *
字符时,你可以执行以下操作:
删除最左边的 *
字符,同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典序最小的字符,你可以删除它们中的任意一个。
请你返回删除所有 *
字符以后,剩余字符连接而成的 字典序最小 的字符串。
示例 1:
输入:s = “aaba*”
输出:“aab”
解释:删除 ‘*’ 号和它左边的其中一个 ‘a’ 字符。如果我们选择删除 s[3] ,s 字典序最小。
示例 2:
输入:s = “abc”
输出:“abc”
解释:字符串中没有 ‘*’ 字符。
提示:
- 1 <= s.length <= 105
- s 只含有小写英文字母和
*
字符。 - 输入保证操作可以删除所有的
*
字符。
题解
以本人浅薄的认知,我觉得这道题要遍历字符串,标记26个小写字母的位置,然后删掉*
,再删掉任意一个字典序最小的。
这就掉坑里咯~
看题:请你返回删除所有 *
字符以后,剩余字符连接而成的 字典序最小 的字符串。
字典序最小,就要删除最右边的。
class Solution {
public String clearStars(String S) {
char[] s = S.toCharArray();
List<Integer>[] st = new ArrayList[26];
Arrays.setAll(st, i -> new ArrayList<>());
for (int i = 0; i < s.length; i++) {
if (s[i] != '*') {
st[s[i] - 'a'].add(i);
continue;
}
for (List<Integer> p : st) {
if (!p.isEmpty()) {
p.remove(p.size() - 1);
break;
}
}
}
List<Integer> idx = new ArrayList<>();
for (List<Integer> p : st) {
idx.addAll(p);
}
Collections.sort(idx);
StringBuilder t = new StringBuilder(idx.size());
for (int i : idx) {
t.append(s[i]);
}
return t.toString();
}
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/lexicographically-minimum-string-after-removing-stars/solutions/2798240/yong-26-ge-zhan-mo-ni-pythonjavacgo-by-e-mhtn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本人不会写,只能搬运大佬的题解[狗头保命]
第四道题就不看了,以我现在的水平,做不出来。