1.题目:2341. 数组能形成多少数对 - 力扣(LeetCode)
思路:排序,看前一个是否等于后一个,相等形成数对并变成-1.后续根据数组中不是-1的数计算剩余的数个数
class Solution {
public:
vector<int> numberOfPairs(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0, count = 0;
for(int i = 0;i < nums.size() - 1; i ++ ){
if(nums[i] == nums[i+1]){
nums[i] = -1;
nums[i+1] = -1;
res++;
}
}
for(int i = 0; i < nums.size(); i ++ ){
if(nums[i] != -1)
count ++;
}
return { res, count };
}
};
2.题目:2342. 数位和相等数对的最大和 题解 - 力扣(LeetCode)
思路:使用key和value的值进行串联,通过不断的比较更新最大和,key表示数位和,value记录下标
class Solution {
public:
int fun(int x) {
int y = 0;
while(x)
{
int z = x % 10;
y += z;
x /= 10;
}
return y;
}
int maximumSum(vector<int>& nums) {
int res = 0;
unordered_map<int, int>map; //key表示fun(n),value记录下标
for(int i = 0; i < nums.size(); ++i) {
int key = fun(nums[i]);
if(map.count(key)) {
//出现数位和相等,记录前一key值的下标,方便从数组中访问
int value = map[key];
//记录此次数位和相等数对和
int sum = nums[i] + nums[value];
//更新结果最大值
res = max(res, sum);
if(nums[i] > nums[value])
//数位和相等时,第二次出现数组元素值大于之前数组元素值,更新key值对应的value为当前数组下标
map[key] = i;
}else{ map[key] = i; }
}
if(res == 0) return -1;
else return res;
}
};
3.题目:2343. 裁剪数字后查询第 K 小的数字 - 力扣(LeetCode)
思路:先遍历queri来找到每次的k和trim,再针对每次的trim进行裁剪,同时把裁剪后的字符串与角标进行关联,最后通过对前者的排序来找到第k小字符串的角标
class Solution {
public:
vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
vector<int> ans(queries.size(),0);
int nSize = nums[0].size();
for(int i=0;i<queries.size();i++){
int k = queries[i][0];
int trim=queries[i][1]; //获取k值和trim值
vector<pair<string,int>> t(nums.size());
for(int j=0;j<nums.size();j++){
t[j] = make_pair(nums[j].substr(nSize-trim),j); //关联截取后的字符串与其下标
}
sort(t.begin(),t.end()); //对前面的元素进行排序
ans[i] = t[k-1].second; //把角标赋给结果数组
}
return ans;
}
};
4.题目:2344. 使数组可以被整除的最少删除次数 - 力扣(LeetCode)
思路:先求出numsDivide中所有数的最大公因数res,对nums进行排序,按顺序判断是否能整除res,不能整除则删除当前数往后判断
class Solution {
public:
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
// 求最大公因数
int minOperations(vector<int>& nums, vector<int>& numsDivide) {
int res = numsDivide[0];
for (int i = 1; i < numsDivide.size(); i++) {
res = gcd(res, numsDivide[i]);
}
// 求得所有numsDivide的最大公因数
sort(nums.begin(), nums.end());
int cnt = 0;
for (int i = 0; i < nums.size(); i++) {
if (res % nums[i] == 0) {
return cnt;
}
cnt++;
// 从小到大如果不能整除,则删除次数+1,进入下一次判断
}
return -1;
// if条件没有满足,返回-1
}
};