LeetCode笔记:Weekly Contest 281

Posted Espresso Macchiato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 281相关的知识,希望对你有一定的参考价值。

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题我的解法同样异常暴力,就是遍历一下范围内所有的数字然后一一检验。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countEven(self, num: int) -> int:
        res = 0
        for i in range(1, num+1):
            d = 0
            while i != 0:
                d += i % 10
                i = i // 10
            if d % 2 == 0:
                res += 1
        return res

提交代码评测得到:耗时50ms,占用内存13.8MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题可以拆分为两个步骤,首先用一个数组保存下来合并后的元素,然后再将其恢复成一个链表就行了。

而这两个子步骤事实上都比较简单,因此这里就不多做展开了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
        s = 0
        res = []
        while head:
            if head.val == 0:
                node = ListNode(s)
                if res != []:
                    res[-1].next = node
                res.append(node)
                s = 0
            else:
                s += head.val
            head = head.next
        
        return res[1]

提交代码评测得到:耗时4352ms,占用内存104.1MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题思路其实很简单,就是先用一个counter统计一下所有字母出现的个数,然后按照倒序以及不重复规则重新进行排序就行了。

唯一需要注意的就是各个边界条件,容易出现错误。

2. 代码实现

给出python代码实现如下:

class Solution:
    def repeatLimitedString(self, s: str, repeatLimit: int) -> str:
        cnt = Counter(s)
        res = ""
        letters = string.ascii_lowercase[::-1]
        for i, ch in enumerate(letters):
            if cnt[ch] == 0:
                continue
            j = i+1
            while j < 26 and cnt[ch] >= repeatLimit:
                while j < 26 and cnt[letters[j]] == 0:
                    j += 1
                if j >= 26:
                    break
                r = min(cnt[ch] // repeatLimit, cnt[letters[j]])
                res += (ch * repeatLimit + letters[j]) * r
                cnt[ch] -= repeatLimit * r
                cnt[letters[j]] -= r
            if j >= 26:
                res += ch * min(repeatLimit, cnt[ch])
            elif 0 < cnt[ch] < repeatLimit:
                res += ch * cnt[ch]
            elif cnt[ch] == 0:
                res = res[:-1]
                cnt[letters[j]] += 1
            cnt[ch] = 0
        return res

提交代码评测得到:耗时84ms,占用内存15.7MB。

4. 题目四

给出题目四的试题链接如下:

1. 解题思路

这一题我们的思路同样相对比较暴力,就是找到每一个数和k的最大公约数,然后对其频数进行统计。

最后,我们用一个二重循环遍历一下各个出现过的约数,看一下有哪些组合能够使得乘积能够整除k。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countPairs(self, nums: List[int], k: int) -> int:
        cds = [gcd(x, k) for x in nums]
        cnt = Counter(cds)
        cds = list(cnt.keys())
        n = len(cds)
        res = 0
        for i in range(n):
            d = cds[i]
            if d * d % k == 0:
                res += cnt[d] * (cnt[d]-1) // 2
            for j in range(i+1, n):
                d2 = cds[j]
                if d * d2 % k == 0:
                    res += cnt[d] * cnt[d2]
        return res

提交代码评测得到:耗时1038ms,占用内存27.9MB。

以上是关于LeetCode笔记:Weekly Contest 281的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314