力扣第310场周赛+AcWing第68场周赛补题

力扣

一.出现最频繁的偶数元素

1.原题链接:力扣

2.解题思路:

        用哈希表存储每个元素出现的次数,再遍历,若遇到符合要求的偶数,则把新的X赋值给ans,新的y赋值给best,输出ans即可;

3.参考代码:

class Solution {
public:
    int mostFrequentEven(vector<int>& nums) {
        unordered_map<int, int>mp;
        for(auto & x : nums)mp[x]++;
        int ans = -1, best = 0;
        for(auto it = mp.begin(); it != mp.end(); it++){
            int x = it -> first;
            int y = it -> second;
            if(x % 2)continue;
            if(y > best || (y == best && x < ans))ans = x, best = y;
        }
        return ans;
    }
};

二.子字符串的最优划分

1.原题链接:力扣

2.解题思路:

        每当出现重复字母时再划分,因此维护一个res[x]表示字母x是否出现过,若出现重复字母则清空res,分组加一;

3.参考代码:

class Solution {
public:
    int partitionString(string s) {
        vector<int>res(26);
        int ans = 0;
        for(int i = 0; i < s.length(); i++){
            if(res[s[i] - 'a']){
            ans++;
            res.assign(26, 0);
            res[s[i] - 'a'] = 1;
        }
        else{
            res[s[i] - 'a'] = 1;
            }
        }
        return ans + 1;
    }
};

AcWing

一.去掉0

1.原题链接:4612. 去掉0 - AcWing题库

2.解题思路:

        用 i 和 j 分别去掉前面的0和后面的0,再统计中间剩下的0的个数就是需要删除的最小0的数量;

3.参考代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int T;
    cin >> T;
    while(T--){
        string s;
        cin >> s;
        int ans = 0;
        int i = 0, j = s.length() - 1;
        while(i < s.length() && s[i] == '0')i++;
        while(j >= 0 && s[j] == '0')j--;
        for(int k = i; k <= j; k++){
            if(s[k] == '0')ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

二.方格跳跃

1.原题链接:4613. 方格跳跃 - AcWing题库

2.解题思路:

        统计左边的“<”数量和右边的“>”数量之和,因为在这个后缀和前缀里的任何一个点肯定都是能走出边境的,输出总和即可;

3.参考代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int len, res;
    string str;
    cin >> len >> str;
    for (int i = 0; i < len && str[i] == '<'; i++) res++;
    for (int i = len - 1; i >= 0 && str[i] == '>'; i--) res++;
    cout << res << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值