力扣【LeetCode】第 326 场周赛

统计能整除数字的位数

题目描述
在这里插入图片描述
解题思路:
暴力求解即可

AC代码:

class Solution {
public:
    int countDigits(int num) {
        int sum = 0, val = num, k = 0;
        while(val > 0) {
            k = val % 10;
            if(num % k == 0) sum ++;
            val /= 10;
        }
        return sum;
    }
};

数组乘积中的不同质因数数目

题目描述
在这里插入图片描述
解题思路:
直接查找数组nums元素所有的质因数,然后用set去重即可

AC代码:

class Solution {
public:
    bool judge(int n) {
        if(n < 2) return false;
        if(n == 2) return true;
        if(n % 2 == 0) return false;
        for(int i = 3; i * i <= n; i += 2) 
            if(n % i == 0) return false;
        return true;
    }
    int distinctPrimeFactors(vector<int>& nums) {
        set<int>s;
        for(auto &i: nums) {
            if(judge(i)) s.insert(i);
            else {
                for(int j = 2; j <= i / 2; j++) {
                    if(judge(j) && (i % j == 0)) {
                       s.insert(j);
                      // cout << j << endl;
                    }
                }
            }
            
        }
        return s.size();
    }
};

将字符串分割成值不超过 K 的子字符串

题目描述:
在这里插入图片描述
解题思路:
贪心

AC代码:

class Solution {
public:
    int minimumPartition(string s, int k) {
        long long ans = 1, cur = 0;
        for(auto &i: s) {
            if(i - '0' > k) return -1;
            cur = cur * 10 + (i - '0');
            if(cur > k) {
                ans++;
                cur = (i - '0');
            }
        }
        return ans;
    }
};

范围内最接近的两个质数

题目描述
在这里插入图片描述
解题思路:
先用素数筛把1~1e6之内的素数筛选出来,然后从筛选出来的素数primes里面查找最优的整数对即可

AC代码:

class Solution {
public:
    const int maxn = 1e6+10;
    bool prime[1000020] = {false}; // 标记i是不是素数
    int primes[1000020] = {0}, cnt;// 存储素数
    void Set() {
        cnt=1;
        memset(prime,1,sizeof(prime));//初始化认为所有数都为素数
        prime[0]=prime[1]=0;//0和1不是素数
        for(long long i=2;i<=maxn;i++)
        {
            if(prime[i])
                primes[cnt++]=i;//保存素数i
            for(long long j=1;j<cnt && primes[j]*i<maxn;j++)
            {
                prime[primes[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数
            }
        }
    }
    vector<int> closestPrimes(int left, int right) {
        Set();
        vector <int> ans;
        int low = left, high = right;
        bool flag = false;
        for(int i = 0; i < cnt - 1; i++) {
            if(primes[i]>= left && primes[i] <= right) {
                if(primes[i+1] >= left && primes[i+1] <= right) {
                    if(primes[i+1] - primes[i] < high - low) {
                        low = primes[i], high = primes[i+1];
                        flag = true;
                    }
                }
            }
        }
        if(!flag && (!prime[low] || !prime[high])) ans.push_back(-1), ans.push_back(-1);
        else ans.push_back(low), ans.push_back(high);
        return ans;
    }
};

周赛小结

2023年的第一场力扣周赛,但是由于记错时间只能赛后把这四个题给补了,总的来说这四个题难度适中,基本上贪心+模拟就能顺利AC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值