周 赛 补 题

力扣315场:竞赛 - 力扣 (LeetCode)

1.与对应负数同时存在的最大正整数

力扣

把所有数加入 set ,枚举每个正数,检查 set 里是否有对应负数

class Solution {
public:
    set<int>s;
    int findMaxK(vector<int>& nums) {
        for(auto i:nums){
            s.emplace(i);
        }
        int res=-1;
        for(auto i:nums){
            if(s.count(i)&&s.count(-i)) res=max(res,abs(i));
        }
        return res;
    }
};

2.反转后不同整数的数目

力扣

写一个reverse()来作为反转函数,定义一个set来储存原数组与反转数组的元素(因为set不允许重复元素),遍历数组,一边反转一边添加,最后返回set的长度即为所求

class Solution {
public:
    int countDistinctIntegers(vector<int>& nums) {
        unordered_set<int> sum;
        for(int n : nums) sum.insert(n),sum.insert(reverse(n));
        return sum.size();
    }

    int reverse(int x)
    {
        int n = 0;
        while(x){
            n = n *10 + x % 10;
            x /= 10;
        }
        return n;
    }
};

力扣第89场双周赛

1.有效时间数目

力扣

枚举每一个可能的时间,如果time[x]不是‘?’且和枚举的时间的对应位不同,则不加1,否则+1

class Solution {
public:
    int countTime(string time) {
        int res=0;
        for(int i=0;i<24;i++){
            for(int j=0;j<60;j++){
                if (time[0]!='?' && time[0]-'0'!=i / 10) {continue;}
                if (time[1]!='?' && time[1]-'0'!=i % 10) {continue;}
                if (time[3]!='?' && time[3]-'0'!=j / 10) {continue;}
                if (time[4]!='?' && time[4]-'0'!=j % 10) {continue;}
                res+=1;
                }
            }
            return res;
    }
};

2.二的幂数组中查询范围内的乘积

力扣

先将n快速二进制分解,后面直接暴力,一边累乘一边取余以免越界
 

class Solution {
public:
    vector<int> productQueries(int n, vector<vector<int>>& queries) {
        vector<int>arr;
        vector<int>ans;
        while(n>0)                              //二进制分解
        {
            arr.push_back(n - (n&(n-1)));               
            n&=(n-1);
        }
        for(int i=0;i<queries.size();++i)       //暴力求解
            {
                long sum=1;
                for(int k=queries[i][0];k<=queries[i][1];++k)
                {
                    sum*=arr[k];
                    sum%=(long)(1e9+7);
                }
                ans.push_back((int)sum);
            }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值