第314场周赛

2432. 处理用时最长的那个任务的员工-Easy

题目描述:

共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。

给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] :

idi 是处理第 i 个任务的员工的 id ,且

leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。

注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。

返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。

题目解析:

很简单,找到所有用时最长的任务,然后在这些任务中选择id号最小的进行返回即可,这里需要注意的是,每个任务所需的时间为该任务结束的时间减去上一个任务结束的时间,但第一个任务的时间为其任务结束时间,代码如下:

class Solution {
public:
    int hardestWorker(int n, vector<vector<int>>& logs) {
        int time = logs[0][1];
        for(int i = 1 ;  i<logs.size() ; i++){
            int spend = logs[i][1]-logs[i-1][1];
            if(spend>time)time = spend;    
        }
        int idx = n;
        for(int i = 1 ;  i<logs.size() ; i++){
            int spend = logs[i][1]-logs[i-1][1];
            if(spend==time){
                if(logs[i][0]<idx)idx = logs[i][0];
            }    
        }
        if(logs[0][1]==time){
            idx = logs[0][0]<idx?logs[0][0]:idx;
        }
        return idx;
    }
};

执行用时:60 ms, 在所有 C++ 提交中击败了78.11%的用户

内存消耗:34.5 MB, 在所有 C++ 提交中击败了97.53%的用户


2433. 找出前缀异或的原始数组-Medium

题目描述:

给你一个长度为 n 的 整数 数组 pref 。找出并返回满足下述条件且长度为 n 的数组 arr :

pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i].

注意 ^ 表示 按位异或(bitwise-xor)运算。

可以证明答案是 唯一 的。

题目解析:

一个简单的数学题,假设我们结果数组为res,首先res[0]=pref[0],res[1]^res[0]=pref[1],那么res[1] = pref[1]^res[0],res[2] = pref[2]^res[0]^res[1],依次类推下去即可,代码如下:

class Solution {
public:
    vector<int> findArray(vector<int>& pref) {
        int len = pref.size();
        vector<int> res(len);
        res[0] = pref[0];
        int temp = res[0];
        for(int i = 1 ; i<len ; i++){
            res[i] = pref[i]^temp;
            temp ^= res[i];
        }
        return res;
    }
};

执行用时:92 ms, 在所有 C++ 提交中击败了65.13%的用户

内存消耗:74.2 MB, 在所有 C++ 提交中击败了57.15%的用户


2434. 使用机器人打印字典序最小的字符串-Medium

题目描述:

给你一个字符串 s 和一个机器人,机器人当前有一个空字符串 t 。执行以下操作之一,直到 s 和 t 都变成空字符串:

删除字符串 s 的 第一个 字符,并将该字符给机器人。机器人把这个字符添加到 t 的尾部。

删除字符串 t 的 最后一个 字符,并将该字符给机器人。机器人将该字符写到纸上。

请你返回纸上能写出的字典序最小的字符串。

题目解析:

根据题目要求,我们将一个字符串进行入栈出栈处理,要保证这个字符串的字典序最小,贪心,当栈顶元素为所剩元素中的字典序最小元素时,我们进行栈顶元素的弹出,因为这个时候如果不弹出的话,后续操作是一定会导致字典序大于等于目前弹出的情况的,如果不是那么就继续入栈即可,最后我们将栈内所有元素依次弹出即可得到我们所要求的字典序最小字符串,代码如下:

class Solution {
public:
    bool decide(char cur , int idx , string str){
        for(int i = idx ; i<str.size() ; i++){
            if(str[i]<cur)return false;
        }
        return true;
    }
    string robotWithString(string s) {
        int len = s.size();
        stack<char> stk;
        stk.push(s[0]);
        string res = "";
        for(int i = 1 ; i < len ;){
            if(!stk.empty()&&decide(stk.top(),i,s)){
                res+=stk.top();
                stk.pop();
            }
            else{
                stk.push(s[i++]);
            }
        }
        while(!stk.empty()){
            res+=stk.top();
            stk.pop();
        }
        return res;
    }
};

使用了O(N^2)的时间复杂度造成了超时,所以先通过一个for循环做了一个预处理,找到了某个位置之后最小字典序字符的数值,然后在后续循环中直接调用即可,代码如下:

class Solution {
public:
    string robotWithString(string s) {
        int len = s.size();
        vector<int> val(len);
        val[len-1] = (int)s[len-1];
        for(int i = len - 2 ; i>=0 ; i--){
            val[i] = min(val[i+1],(int)s[i]);
        }
        stack<char> stk;
        stk.push(s[0]);
        string res = "";
        for(int i = 1 ; i < len ;){
            if(!stk.empty()&&stk.top()<=val[i]){
                res+=stk.top();
                stk.pop();
            }
            else{
                stk.push(s[i++]);
            }
        }
        while(!stk.empty()){
            res+=stk.top();
            stk.pop();
        }
        return res;
    }
};

执行用时:108 ms, 在所有 C++ 提交中击败了70.17%的用户

内存消耗:37.6 MB, 在所有 C++ 提交中击败了15.90%的用户

### LeetCode周赛概述 LeetCode周赛是一项在线编程竞赛活动,旨在帮助程序员提升算法能力并准备技术面试。参与者可以在规定的时间内解决一系列具有挑战性的编程问题[^1]。 ### 参加方法 为了参与LeetCode周赛,用户需先注册一个LeetCode账号,并定期关注官方公告获取最新的赛事通知。比赛通常会在周末举行,在比赛当天登录网站进入指定的比赛页面即可开始作答。对于初次参赛者来说,可能会遇到一些操作上的不熟悉,比如不清楚在哪里提交解答等问题,但随着经验积累这些问题都会迎刃而解[^2]。 ### 比赛时间安排 LeetCode周赛一般固定在北京时间每周日凌晨01:00(UTC/GMT+8)准时开赛,持续时间为两小时。在此期间,选手可以自由选择任意连续的两个小时完成比赛中的题目。需要注意的是,具体的比赛日期和时间可能因节假日等因素有所调整,请务必留意官网发布的最新消息[^4]。 ### 题目类型分析 比赛中涉及的题目种类繁多,涵盖了数据结构、算法设计等多个方面。常见的题目形式包括但不限于: - 数组与字符串处理 - 动态规划 - 图论及其应用 - 排序与查找技巧 - 栈队列等高级数据结构的应用 这些题目往往要求较高的逻辑思维能力和扎实的基础知识掌握程度。例如,在某些情况下,一道看似简单的数组运算题也可能隐藏着深层次的数据结构优化思路;而在另一些景下,则需要运用到复杂的动态规划策略来解决问题[^5]。 ```python def example_function(input_data): """ 这是一个示例函数,用于展示如何编写Python代码。 参数: input_data (list): 输入的数据列表 返回: result (int): 计算后的结果值 """ # 处理输入数据... processed_data = sorted(input_data) # 执行核心计算逻辑... result = sum(processed_data[:3]) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值