LeetCode ---400周赛

题目列表

3168. 候诊室中的最少椅子数

3169. 无需开会的工作日

3170. 删除星号以后字典序最小的字符串

3171. 找到按位与最接近 K 的子数组

一、候诊室中的最少椅子数

简单的模拟题,我们可以这样来模拟:当有顾客来时,我们加一把椅子,当有顾客走时,我们减少一把椅子,这样我们就i能动态的获得所有时刻需要的椅子数量,取最大值即可,代码如下

class Solution {
public:
    int minimumChairs(string s) {
        int ans = 0, cnt = 0;
        for(auto e:s){
            if(e == 'E') cnt++;
            else cnt--;
            ans = max(ans, cnt);
        }
        return ans;
    }
};

二、无需开会的工作日

这里有两种思路:1、直接算放假天数,2、先算开会天数,再用总数减去上班天数得到放假天数,这两种方法都可以,代码如下

// 方法一:直接算放假天数
class Solution {
public:
    int countDays(int days, vector<vector<int>>& meetings) {
        int n = meetings.size();
        sort(meetings.begin(),meetings.end());
        int ans = 0, end = 0;
        for(int i = 0; i < n; i++){
            if(meetings[i][0]>end) ans += meetings[i][0] - end - 1;
            end = max(end, meetings[i][1]);
        }
        if(end < days) ans += days - end;
        return ans;
    }
};

// 方法二:先算开会天数,再得出放假天数
class Solution {
public:
    int countDays(int days, vector<vector<int>>& meetings) {
        int n = meetings.size();
        sort(meetings.begin(),meetings.end());
        int ans = 0, end = meetings[0][1];
        for(int i = 0; i < n;){
            int j = i++;
            while(i<n && end>=meetings[i][0]-1){
                end = max(end, meetings[i][1]);
                i++;
            }
            ans += end - meetings[j][0] + 1;
            if(i < n) end = max(end, meetings[i][1]);
        }
        return days - ans;
    }
};

三、删除信号以后字典序最小的字符串

题目要求在删除*的同时,删除字典序最小的字符。故这题的关键就在于该如何选择和*一起删除的最小字符?这里先输出结论:删除距离*最近的最小字符得到的字符串最大。为什么呢?

1、假设最小的字符的前后字符都比它大,如cbacbacba中的a,这时,我们无论删除哪一个a都会让字符串的字典序变大,但是删除最右边的a得到的字典序最小(这是由字典序的定义决定的,越靠前的字符的权重越大,因为我们优先比较前面的字符,可以用数字来理解,比如151515,我们肯定选择将最后一个1去掉,这样得到的数字最大,因为它的权重小在十位) => 优先选择靠右的最小字符进行删除。

2、如果有只有一段连续的最小字符呢?如aaaaaaaaab,这时,我们无论删除哪一个a,产生的字符串字典序都相同。如果有多段连续的最小字符呢?如abaabaaab,显然,我们应该优先选择右边的最小字符连续段进行删除操作。

在兼顾1的情况下,我们得出结论:优先选择最靠右的最小字符进行删除,即删除距离*最近的最小字符

代码如下

class Solution {
public:
    string clearStars(string s) {
        int n = s.size();
        vector<vector<int>> pos(26);
        for(int i = 0; i < n; i++){
            if(isalpha(s[i])) {
                pos[s[i]-'a'].emplace_back(i); // 记录字符的位置
            }else{
                for(auto& v:pos){
                    if(v.size()){
                        s[v.back()] = '*'; // 将要删除的最小字符置为*
                        v.pop_back(); // 从记录中删除
                        break;
                    }
                }
            }
        }
        s.erase(remove(s.begin(),s.end(),'*'),s.end()); // 删除字符串中的*,O(n)
        return s;
    }
};

四、找到按位与最接近k的子数组

这题考的是&运算的性质:参与&的数字越多,结果越小 --- 具有单调性。在结合题目中要求子数组&的结果,其实就可以用滑动窗口来做,思路如下

假设[ L,R ] 的子数组&结果为res

  • 如果res>k,我们让res继续和后面的数进行&,因为res可以变的更小,即可能更加靠近k
  • 如果res=k,可以直接返回0
  • 如果res<k,由于&的数子越多,res越小,我们需要将左端点向右移,减少区间内的数字,让res变大,才可能更靠近k

所以问题的难点在于如何在移动左端点的同时,维护res?我们可以统计区间中的数字的二进制位0的出现次数,代码如下

class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int n = nums.size();
        int ans = INT_MAX;
        int cnt0[32]{};
        int res = -1; // -1的二进制为全1,不影响&结果
        for(int l = 0, r = 0; r < n; r++){
            // 进窗口
            res &= nums[r];
            // 统计0的出现次数
            for(int i = 0; i < 32; i++)
                if((nums[r]>>i&1)==0)
                    cnt0[i]++;
            // 出窗口
            while(l < r && res <= k){ // 这里注意 l < r必须要写,因为 当l > r时,res会一直等于-1,会死循环
                if(res == k) return 0;
                ans = min(abs(k-res), ans); // 注意在<k或者>k的情况下都要更新答案
                for(int i = 0; i < 32; i++){
                    if((nums[l]>>i&1)==0)
                        if(--cnt0[i]==0)
                            res |= (1<<i);
                }
                l++;
            }
            ans = min(abs(k-res), ans); // 注意在<k或者>k的情况下都要更新答案
        }
        return ans;
    }
};

当然这种位运算的题,其实还有另一种通解,简单来说就是暴力枚举所有可能的&结果(可以优化),代码如下

// O(nlogU) U = max(nums) ,在这里可以认为是O(n)的时间复杂度
class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int n = nums.size();
        int ans = INT_MAX;
        for(int i = 0; i < n; i++){
            int x = nums[i];
            ans = min(ans, abs(x-k));
            // 注意这里的限制条件
            // 因为&只能让数字变小,所以一旦[j,i]区间内的数字&结果和原先相同,则nums[i]将无法更新前面的&结果
            for(int j = i - 1; j>=0 && (nums[j]&x)!=nums[j]; j--){
                nums[j] &= x; // nums[j] 只能变小30次,因为题目范围内的数字二进制最多有30个1
                ans = min(ans,abs(nums[j]-k));
            }
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/692377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用GPT-4o函数调用构建一个实时应用程序?

本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。 我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在&#xff0c;我们将通过将来自Fligh…

React + SpringBoot实现图片预览和视频在线播放,其中视频实现切片保存和分段播放

图片预览和视频在线播放 需求描述 实现播放视频的需求时&#xff0c;往往是前端直接加载一个mp4文件&#xff0c;这样做法在遇到视频文件较大时&#xff0c;容易造成卡顿&#xff0c;不能及时加载出来。我们可以将视频进行切片&#xff0c;然后分段加载。播放一点加载一点&am…

【稳定检索/投稿优惠】2024年材料科学与能源工程国际会议(MSEE 2024)

2024 International Conference on Materials Science and Energy Engineering 2024年材料科学与能源工程国际会议 【会议信息】 会议简称&#xff1a;MSEE 2024大会地点&#xff1a;中国苏州会议官网&#xff1a;www.iacmsee.com会议邮箱&#xff1a;mseesub-paper.com审稿结…

【基于C++与OpenCV实现魔方图像识别和还原算法】施工总览图

文章目录 主要效果展示思维导图魔方还原算法 本系列博客长期更新&#xff0c;分为两大部分 OpenCV实现魔方六面识别 C编写科先巴二阶段还原算法实现三阶魔方的还原 主要效果展示 摄像头识别六面 3D图像构建&#xff0c;提供还原公式 动画演示还原过程 思维导图 魔方还原算法 参…

Java Web学习笔记26——Element常用组件

常见组件&#xff1a; 就是一个复制和粘贴的过程。 Table表格&#xff1a;用于展示多条结构类的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 常见组件-分页主键&#xff1a; Pagination&#xff1a;分页&#xff1a;当数据量比较多时&#xff0c;使用分…

sqlmap直接嗦 dnslog注入 sqllibs第8关

dnslog注入是解决注入的时候没有回显的情况&#xff0c;通过dns外带来进行得到我们想要的数据。 我们是用了dns解析的时候会留下记录&#xff0c;这时候就可以看见我们想要的内容。 这个时候我们还要了解unc路径以及一个函数load_file()以及concat来进行注入。看看我的笔记 unc…

atmel studio 无法通过printf打印浮点数到串口

择右侧的项目,右键,选择properties 系统把它优化了&#xff0c;所以删除&#xff0c;即可 然后&#xff0c;选择相应波特率&#xff0c;效验位&#xff0c;数据位是否正确&#xff0c;即可

Transformer 动画讲解:多层感知机

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

Golang | Leetcode Golang题解之第138题随机链表的复制

题目&#xff1a; 题解&#xff1a; func copyRandomList(head *Node) *Node {if head nil {return nil}for node : head; node ! nil; node node.Next.Next {node.Next &Node{Val: node.Val, Next: node.Next}}for node : head; node ! nil; node node.Next.Next {if…

项目bug1

大项目测bug的时候让输入数字&#xff0c;如果不是则捕获异常&#xff0c;提示错误&#xff0c;几段很简单的代码&#xff1a; System.out.println("请输入要存入的金额"); Scanner sc new Scanner(System.in); while(true) {try {money sc.nextInt();break;} cat…

ctfshow-web入门-命令执行(web41_exp与分析)

过滤不严&#xff0c;命令执行 preg_match(/[0-9]|[a-z]|\^|\|\~|\$|\[|\]|\{|\}|\&|\-/i, $c) 过滤掉了数字、字母以及一些符号&#xff0c;之前接触过的无字母 rce 是取反编码再取反&#xff0c;采用不可见字符去绕过正则&#xff0c;但是这里取反符号被过滤掉了&#x…

mysql (事物)

一.什么是事物 事物是一组操作的集合&#xff0c;不可分割的工作单位&#xff0c;事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求&#xff0c;就是这些操作要么一起成功要么一起失败。 二.事物操作 &#xff08;这个就是一个理解&#xff09; 1.事务特性 原子性…

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序&#xff0c;在程序发生异常时就可以执行预先设定好的处理程序&#xff0c;处理程序执行完之后&#xff0c;可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…

信息安全与密码技术概述

1. 信息安全的法律法规 2016年11月7日&#xff0c;中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过《中华人民共和国网络安全法》&#xff0c;自2017年6月1日起施行。 2019年10月26日&#xff0c;中华人民共和国第十三届全国人民代表大会常务委员会第十四…

C++ | Leetcode C++题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {auto wordDictSet unordered_set <string> ();for (auto word: wordDict) {wordDictSet.insert(word);}auto dp vector <bool> (s.…

高质量 HarmonyOS 权限管控流程

高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中&#xff0c;往往会涉及到敏感数据和硬件资源的调动和访问&#xff0c;而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解&#xff0c;才可以在应用开发中提高效率和避免踩坑。 权限管控了…

Django 表里做删除

先看效果图 点击 删除 按钮之后&#xff0c;就可以下面的效果 操作步骤&#xff1a; 1. 在 urls.py 文件里&#xff0c;添加路劲&#xff1a; urlpatterns [path(asset/<int:aid>/delete/, am_views.asset_delete),]2. 在 views.py 文件里&#xff0c;实现一个新的函…

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

上位机快速开发框架

右上角向下按钮 -> 后台配置 系统菜单 角色管理 分配权限 用户管理 设备配置 通道管理 首页界面设计 设备1配置 带反馈按钮&#xff0c;如&#xff1a;用户按键00105&#xff0c;PLC反馈状态00106 设备2配置 参数说明&#xff1a; TagName_Main&#xff1a;主要信息&#…