【周赛】第382场周赛

博客主页: A_SHOWY
系列专栏:力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_ 

从这一场(第382场周赛)周赛开始记录,目标是尽快达到准确快速AC前三道题,每场比赛稳定在前1000名,故总结每场比赛的前三个题目。

【1】按键变更的次数

100215. 按键变更的次数icon-default.png?t=N7T8https://leetcode.cn/problems/number-of-changing-keys/

这个题目过于简单,追求速度,掌握大小写之间的快速转换即可 

  1. 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. 子集中元素的最大数量icon-default.png?t=N7T8https://leetcode.cn/problems/find-the-maximum-number-of-elements-in-subset/

这道题目花费了我大量的时间,可以说踩了很多坑,有很多值得注意的细节,主要还是模拟,但是我模拟的思路错了,我是从两边往中间模拟,用了三层for把自己都绕晕了,羊佬的思路拿来借鉴后发现还有一个很大的坑,这个哈希表如果调用一个没有的话,会重新生成一个map,且这个map里只有这个数值。还要考虑这个数组里面有1的情况。

【周赛】第382场周赛_第1张图片

  1. 先用哈希表记录一下每个数值的个数,然后第一层循环,让每个值都当一遍最中间的数, 内层循环中我一直习惯用for,但是这里用while更合适,让不合适的时候break更方便,初始值是1,先看看x是不是完全平方数,如果是,再看他的平方根的哈希值是不是大于2,如果大于2,才能加这一对。
  2. 想到上面那个方法的关键在于观察这一列数,从中间开始,往旁边都是平方。
  3. 注意当这个数组中如果有1,那么1的任意次方都是1,所以有奇数个1就是直接返回个数,偶数个就返回个数减去一个。
  4. 在算这个哈希表中是1的数的时候,假如一个map中没有1,那么会重新生成一个map,且这个map里只有这个数值1,所以在调用之前要先find,后面调用countMap的时候同理。
class Solution {
public:
   
    int maximumLength(vector& nums) {
       
        unordered_map 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 玩鲜花游戏icon-default.png?t=N7T8https://leetcode.cn/problems/alice-and-bob-playing-flower-game/

个人感觉这个题非常简单,不配作为第三题,其核心就是这两个数只要加起来是奇数,那么最后一定是Alice拿到最后一个,直接模拟很快能解出来。

  1. 如果m是偶数,那么每个n对应的都是m/2个对应的
  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) ;
           }
       } 
        
    }
};

 

你可能感兴趣的:(算法,力扣)