LeetCode 第 302 场周赛

LeetCode第 302 场周赛

题目一

map,或者排序都行,easy

代码:

class Solution {
public:
    vector<int> numberOfPairs(vector<int>& nums) {
        int ans1=0,ans2=0;
        map<int,int> hx;
        for(auto x:nums) hx[x]++;
        for(auto &[l,r]:hx){
            if(r%2==0) ans1+=r/2;
            else {
                ans2++;
                ans1+=(r/2);
            }
        }
        return {ans1,ans2};
    }
};

题目二 6164. 数位和相等数对的最大和

可以发现,1e9的数位和最大就只有81种,使用map当桶,然后把数位和一样的放入一个桶内,然后找出每个桶的最大的两个之和,更新答案。

代码:

class Solution {
public:
    int get(int n){
        int res=0;
        while(n){
            res+=n%10;
            n/=10;
        }
        return res;
    }
    int maximumSum(vector<int>& nums) {
        map<int,vector<int>> a;

        for(int i=0;i<nums.size();i++){
            int num=get(nums[i]);
            a[num].push_back(nums[i]);
        }
        int ans=-1;
        for(auto &[l,r]:a){
            sort(r.begin(),r.end(),[&](int a,int b){
                return a>b;
            });
            if(r.size()>=2) ans=max(ans,r[0]+r[1]);
        }
        return ans;
    }
};

题目三 6121. 裁剪数字后查询第 K 小的数字

看到数据量很小,直接模拟就行了;pair排序先按第一关键字排序,然后按而关键字排序。字符串排序按字典序排序。可以忽略前导0。

代码:

class Solution {
public:
    vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& q) {
        int ans=0;
        int n=q.size();
        vector<int> res;
        for(int j=0;j<n;j++){
            int k=q[j][0],t=q[j][1];
            vector<pair<string,int > >tmp; 
            for(int i=nums.size()-1;i>=0;i--){                                
                string num=nums[i].substr(nums[i].size()-t,t);
                tmp.push_back({num,i});
            }
            sort(tmp.begin(),tmp.end());
            res.push_back(tmp[k-1].second);
        }
        return res;
    }
};

题目四 6122. 使数组可以被整除的最少删除次数

找出第二个数组的gcd,然后去第一个数组判断就行了。easy,甚至比前面还简单。

代码:

class Solution {
public:
    int minOperations(vector<int>& nums, vector<int>& numsDivide) {
        int ans=numsDivide[0];
        for(int i=0;i<numsDivide.size();i++) ans=__gcd(numsDivide[i],ans);
        sort(nums.begin(),nums.end());
        int res=0;
        for(int i=0;i<nums.size();i++){
            if(ans%nums[i]==0) break;
            else  res++;
        }
        if(res==nums.size()) return -1;
        return  res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万伏小太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值