leetcode第 400 场周赛 学习笔记

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本人不会写,只能搬运大佬的题解[狗头保命]
第四道题就不看了,以我现在的水平,做不出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值