🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_
从这一场(第382场周赛)周赛开始记录,目标是尽快达到准确快速AC前三道题,每场比赛稳定在前1000名,故总结每场比赛的前三个题目。
【1】按键变更的次数
100215. 按键变更的次数https://leetcode.cn/problems/number-of-changing-keys/
这个题目过于简单,追求速度,掌握大小写之间的快速转换即可
- toupper 转大写字母,tolower 转小写字母
class Solution {
public:
int countKeyChanges(string s) {
int ans = 0;
for(int i = 1; i < s.size(); i++){
if(s[i] != toupper(s[i - 1]) && s[i] != (s[i -1]) &&s[i] != tolower(s[i - 1]))
ans ++;
}
return ans;
}
};
【2】子集中元素的最大量
100206. 子集中元素的最大数量https://leetcode.cn/problems/find-the-maximum-number-of-elements-in-subset/
这道题目花费了我大量的时间,可以说踩了很多坑,有很多值得注意的细节,主要还是模拟,但是我模拟的思路错了,我是从两边往中间模拟,用了三层for把自己都绕晕了,羊佬的思路拿来借鉴后发现还有一个很大的坑,这个哈希表如果调用一个没有的话,会重新生成一个map,且这个map里只有这个数值。还要考虑这个数组里面有1的情况。
- 先用哈希表记录一下每个数值的个数,然后第一层循环,让每个值都当一遍最中间的数, 内层循环中我一直习惯用for,但是这里用while更合适,让不合适的时候break更方便,初始值是1,先看看x是不是完全平方数,如果是,再看他的平方根的哈希值是不是大于2,如果大于2,才能加这一对。
- 想到上面那个方法的关键在于观察这一列数,从中间开始,往旁边都是平方。
- 注意当这个数组中如果有1,那么1的任意次方都是1,所以有奇数个1就是直接返回个数,偶数个就返回个数减去一个。
- 在算这个哈希表中是1的数的时候,假如一个map中没有1,那么会重新生成一个map,且这个map里只有这个数值1,所以在调用之前要先find,后面调用countMap的时候同理。
class Solution {
public:
int maximumLength(vector<int>& nums) {
unordered_map<int,int> countMap;
//统计元素出现次数
for(int num : nums){
countMap[num] ++;
}
int ans =0;
if(countMap.find(1) != countMap.end())
ans = max(1,countMap[1] % 2 ? countMap[1] : countMap[1] - 1);
for(auto& entry : countMap){
int x = entry.first;
if(x == 1) continue;
int cur = 1;
while(true){
int v = (int)sqrt(x);
if(v * v != x || countMap.find(v) == countMap.end()|| countMap[v] < 2 ) break;
x = v;
cur += 2;
}
ans = max(ans,cur);
}
return ans;
}
};
【3】Alice和Bob玩鲜花游戏
100195. Alice 和 Bob 玩鲜花游戏https://leetcode.cn/problems/alice-and-bob-playing-flower-game/
个人感觉这个题非常简单,不配作为第三题,其核心就是这两个数只要加起来是奇数,那么最后一定是Alice拿到最后一个,直接模拟很快能解出来。
- 如果m是偶数,那么每个n对应的都是m/2个对应的
- 如果m是奇数,那么分类,n是奇数和n是偶数,把每种情况里面取奇数的和取偶数的配对数加起来就行。注意个返回值。
class Solution {
public:
long long flowerGame(int n, int m) {
if(m % 2 == 0) return ((long long)m * n) / 2;
else{
if(n % 2) {
return ((n + 1) / 2) *((m - 1) /2) + ((n -1)/2) * ((m + 1) /2);
}
else {
return (n / 2) *((m + 1) /2) +(n / 2) *((m - 1) /2) ;
}
}
}
};