• LeetCode Weekly Contest 281


    第一题

    class Solution {
    public:
        int countEven(int num) {
            
            int ans = 0;
            for(int i=1;i<=num;i++)
            {
                 int res = 0;
                 int x = i;
                 while(x)
                 {
                     res+= (x%10);
                     x/=10;
                 }
                
                if((res&1)==0)
                {
                    ans++;
                }
            }
            
            return ans;
            
        }
    };
    

    第二题

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeNodes(ListNode* head) {
            
            ListNode* node = head->next;
            
            
            ListNode* pre = head;
            ListNode* res = head;
            int ans=0;
          
            while(node!=NULL)
            {
                if(node->val == 0)
                {
                        pre->next = new ListNode(ans);
                        pre->next->next = node;
                        pre = node;
     
                        ans=0;
                }
                else
                {
                    ans+=node->val;
                }
                
                node = node->next;
            }
            
            ListNode* node2 = res->next;
            
            while(node2!=NULL&&node2->next!=NULL)
            {
                if(node2->next->val == 0)
                {
                    node2->next = node2->next->next;
                }
                
                node2 = node2->next;
            }
            
            return res->next;
            
        }
    };
    

    第三题

    贪心

    class Solution {
    public:
        int a[30];
        string repeatLimitedString(string s, int repeatLimit) {
            
            memset(a,0,sizeof(a));
            for(int i=0;i<s.length();i++)
            {
                a[s[i]-'a']++;
            }
            
            int pos=25;
            string res="";
            while(pos>=0)
            {
                int i=0;
                while(a[pos]>0 && i< repeatLimit)
                {
                    res+='a'+pos;
                    a[pos]--;
                    i++;
                    
                    if(i==repeatLimit && a[pos]>0)
                    {
                        int j = pos-1;
                        while(j>=0 && a[j]<=0)
                        {
                            j--;
                        }
                        
                        if(j!=-1)
                        {
                            a[j]--;
                            res+='a'+j;
                            i=0;
                        }
                    }
                }
                
                pos--;
            }
            
            return res;
            
        }
    };
    

    第四题

    让你算出一个数组有多少对数字的乘积能被K整除。我们可以对数组中的每个数a[i], 来算a[i+1] - a[n]中有多少个数字和它的乘积是能被k整除的。
    如果我们可以知道 最小的x,是的 x*a[i]能被k整除,那么a[i+1]-a[n]中的每个能整除x的数都是我们要找的数。
    那么这个最小的x怎么算呢,其实是k/gcd(k, a[i]),
    所以我们事先要对k分解因数,然后把数组中能整除这些因数的元素的个数事先存好。
    然后针对每个元素a[i],计算x,再计算a[i+1]-a[n]中能整除x的元素个数

    class Solution {
    public:
        int a[405];
        map<int,int> m;
        int pos;
        long long countPairs(vector<int>& nums, int k) {
            
            pos=0;
            for(int i=1;i*i<=k;i++)
            {
                if(k%i==0)
                {
                    a[pos++] = i;
                    
                    m[i] = pos-1;
                    a[pos++] = k/i;
                    m[k/i] = pos-1;
                }
            }
            
            int sum[pos][100005];
            for(int i=0;i<pos;i++)
            {
                if(nums[0] % a[i] == 0)
                {
                    sum[i][0] =1;
                }
                else
                {
                    sum[i][0] = 0;
                }
                
                for(int j=1;j<nums.size();j++)
                {
                    if(nums[j] % a[i] == 0)
                    {
                        sum[i][j] = sum[i][j-1]+1;
                    }
                    else
                    {
                        sum[i][j] = sum[i][j-1];
                    }
                }
            }
            
            long long int ans=0;
            for(int i=0;i<nums.size();i++)
            {
                int x = k / gcd(nums[i], k);
              
                int j = m[x];
               
                ans+= sum[j][nums.size()-1] - sum[j][i];
              
            }
            
            return ans;
            
        }
        
        int gcd(int x, int y)
        {
            if(x % y == 0)
                return y;
            else
                return gcd(y, x%y);
        }
    };
    
  • 相关阅读:
    Hashmap
    string字符串分词
    关于链表的几道经典例题
    【C语言】链表(LinkedList)的建立与基本操作
    01迷宫
    2019 数学联赛 题解 / 游记
    一种简单方法构造 n 元有限域
    Python逆向某网站之 AES解密数据
    我发现了一个网站Bug,然后反馈了
    在多线程中使用静态方法是否有线程安全问题
  • 原文地址:https://www.cnblogs.com/dacc123/p/15966108.html
Copyright © 2020-2023  润新知