统计能整除数字的位数
题目描述
解题思路:
暴力求解即可
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