力扣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;
}
};