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