LeetCode冲刺:Day51

发布于 2022-12-28  89 次阅读


1. 统计各位数字之和为偶数的整数个数

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

数据范围不大,直接遍历每一个可能的数字即可。

代码

class Solution:
    def countEven(self, num: int) -> int:
        def isEven(x: int) -> bool:
            sum = 0
            while x:
                sum += x % 10
                x //= 10
            return (sum & 1) == 0
        return sum(isEven(i) for i in range(1, num + 1))

2. 合并零之间的节点

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

每当遇见值为 0 的节点,且其后还有节点,那么在答案链上新增一个节点,并让 cur 指向新增节点;否则将当前节点值累加到 cur 上。为了方便起见,用一个 dummy 节点作为答案链的开头,最后返回 dummy.next

代码

class Solution:
    def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode()
        cur = dummy
        while head:
            if head.val == 0 and head.next != None:
                p = ListNode()
                cur.next = p
                cur = cur.next
            else:
                cur.val += head.val
            head = head.next
        return dummy.next

3. 构造限制重复的字符串

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

因为题目说明了,不必使用全部的字符,所以不用考虑最后一种字符的数量超过重复上限的情况(这种情况比较麻烦)。那么直接从最大的字符开始构造,如果超过数量,那么添加一个小一级的字符,再继续构造即可。

代码

class Solution:
    def repeatLimitedString(self, s: str, repeatLimit: int) -> str:
        nums = [0 for i in range(26)]
        for c in s:
            nums[ord(c) - ord('a')] += 1
        ans = ""
        cnt = 0
        i = 25
        while nums[i] == 0 and i >= 0:
            i -= 1
        while i >=0:
            ans += chr(ord('a') + i)
            cnt += 1
            nums[i] -= 1
            while nums[i] == 0 and i >= 0:
                i -= 1
                cnt = 0
            if cnt == repeatLimit:
                j = i - 1
                while nums[j] == 0 and j >= 0: j -= 1
                if j == -1: return ans
                ans += chr(ord('a') + j)
                nums[j] -= 1
                cnt = 0
        return ans

4. 统计数组中相等且可以被整除的数对

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

数据范围不大,一行流。

代码

class Solution:
    def countPairs(self, nums: List[int], k: int) -> int:
        return sum(nums[i] == nums[j] and (i * j) % k == 0 for i in range(len(nums)) for j in range(i + 1, len(nums)))

5. 找到和为给定整数的三个连续整数

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

很简单的问题,三个连续整数的和,一定等于中间的数乘以三。

代码

class Solution:
    def sumOfThree(self, num: int) -> List[int]:
        if num % 3 != 0: return []
        return [(num // 3) - 1,num // 3 , (num // 3) + 1]

6. 拆分成最多数目的正偶数之和

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

不知道 Solution 的调用是怎么样的, __nums 数组实际上计算一次就可以一直用,所以打表也是可以的,会很快。

代码

class Solution:
    __nums: List[int]
    __n: int
    def __init__(self) -> None:
        self.__nums = [0]
        cur = 1
        while self.__nums[cur - 1] < 1e10:
            self.__nums.append(self.__nums[cur - 1] + (cur << 1))
            cur += 1
        self.__n = len(self.__nums)
    def maximumEvenSplit(self, finalSum: int) -> List[int]:
        if (finalSum & 1) == 1: return []
        l, r = 0, self.__n - 1
        while l <= r:
            m = (l + r) // 2
            if self.__nums[m] == finalSum:
                r = m
                break
            elif self.__nums[m] > finalSum: r = m - 1
            else: l = m + 1
        ans = []
        for i in range(1, r + 1):
            ans.append(i << 1)
        ans[r - 1] += finalSum - sum(ans)
        return ans