4.3 LeetCode 第 287 场周赛

6055. 转化时间需要的最少操作数

  • 题目大意
    给定两个以 H H : M M HH:MM HHMM形式的时间,问一个时间经过+60, +15, +5, +1 这4种操作最少操作多少次到达另一个时间。(输入保证第一个时间小于第二个时间)。

  • 思路

  • code

class Solution {
public:
    int convertTime(string current, string correct) {
        int a = current[0]*600+current[1]*60+current[3]*10+current[4];
        int b = correct[0]*600+correct[1]*60+correct[3]*10+correct[4];
        int ans=0,now=b-a;
        
        ans+=now/60;
        now%=60;
        ans+=now/15;
        now%=15;
        ans+=now/5;
        now%=5;
        ans+=now;
        return ans;
    }
};

5235. 找出输掉零场或一场比赛的玩家

  • 题目大意
    给定n组比赛结果,输出那些人没有输过,那些人只输过一场比赛。
  • 思路
    map来做,要注意STL容器的开法。
  • code
class Solution {
public:
    vector<vector<int>> findWinners(vector<vector<int>>& matches) {
        map<int,int> win,all;
        int n = matches.size();
        for(int i=0;i<n;i++)
        {
            all[matches[i][0]]++;
            all[matches[i][1]]++;
            win[matches[i][0]]++;
        }
        vector<vector<int>> ans(2);
        for(auto [u,v]:all)
        {
            if(v==win[u]) ans[0].push_back(u);
            if(v==win[u]+1) ans[1].push_back(u);
        }
        return ans;
    }
};

5219. 每个小孩最多能分到多少糖果

  • 题目大意
    有n堆糖果,有k个小孩,每堆糖果开始拆成几堆,但是不能合并到一起,一个小孩分一堆糖果。问要使每个小孩分到的糖果数一致,最多可以分到多少个。
  • 思路
    二分答案,然后 O ( n ) O(n) O(n)判断是否合法。
  • code
class Solution {
public:
    int maximumCandies(vector<int>& candies, long long k) {
        #define ll long long
        int n = candies.size();
        ll r=0,l=0,all=0;
        for(int i=0;i<n;i++) all+=candies[i];
        r=all;
        ll ans=0;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            if(mid==0) {l=mid+1;continue;}
            ll num=0;
            for(int i=0;i<n;i++)
            {
                num+=candies[i]/mid; 
            }
            if(num>=k) l=mid+1,ans=max(mid,ans);
            else r=mid-1;
        }
        return ans;
    }
};

5302. 加密解密字符串

  • 题目大意
    1.输入一个字符串word1进行encrypt(加密)操作:将word1中每一个字符在keys中对应的下标i替换成values[i],加密的结果为将word1中所有字符都替换之后的结果。
    2.将输入一个字符串word2进行decrypt(解密)操作:将word2中每两个字符一组对应的子串t,找出values[i]==t,用keys[i]替换t,可能会出现多种对应,因此输出解密后的结果为:进行替换后的结果在dictionary中出现了多少次。
  • 思路
    加密操作比较简单:将keys用map从keys[i]映射到i,这样可以 O ( l o g n ) O(logn) O(logn)找到每个字符对应的下标,然后遍历一遍word1,用values替换即可。
    解密操作,可以考虑预处理:dictionary中每个单词经过加密得到的结果存到map中,映射为出现了多少次,这样便例word2时就可以直接用map O ( l o g n ) O(logn) O(logn)找到s解密后在dictionary中出现了几次。
  • code
class Encrypter {
    array<string, 26> mp;
    unordered_map<string, int> cnt;
public:
    Encrypter(vector<char> &keys, vector<string> &values, vector<string> &dictionary) {
        for (int i = 0; i < keys.size(); ++i)
            mp[keys[i] - 'a'] = values[i];
        for (auto &s : dictionary)
            ++cnt[encrypt(s)];
    }

    string encrypt(string word1) {
        string res;
        for (char ch : word1) {
            auto &s = mp[ch - 'a'];
            if (s == "") return "";
            res += s;
        }
        return res;
    }

    int decrypt(string word2)
    {
        if(cnt.count(word2)) return cnt[word2];
        else return 0;
    }
};
/*
 * Your Encrypter object will be instantiated and called as such:
 * Encrypter* obj = new Encrypter(keys, values, dictionary);
 * string param_1 = obj->encrypt(word1);
 * int param_2 = obj->decrypt(word2);
 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值