中等题题解.py|豆包MarsCode AI刷题

85 阅读3分钟

345 出现次数最多字符的质数判定

思路:

  1. is_prime 函数: 这个辅助函数用于检查给定数字是否是质数。我们从 2 开始检查,直到 n 的平方根。如果我们找到一个能整除 n 的数,则 n 不是质数。
  2. Counter: 我们使用 collections.Counter 来统计字符串中每个字符的频率。
  3. max 函数: 找出频率字典中最大的值,这就是字符串中出现次数最多的字符的次数。
  4. 判断质数: 通过调用 is_prime 函数来判断这个最大频率是否为质数,并根据结果返回 "YES" 或 "NO"。
from collections import Counter
def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def solution(s: str) -> str:
    f =  Counter(s)
    cnt = max(f.values())
    if is_prime(cnt):
        return "YES"
    else:
        return "NO"

106小M的多任务下载器挑战

时间复杂度:O(N log N)

def solution(n, array):  
    # 创建一个事件列表  
    events = []  
    
    # 将每个任务的开始和结束时间添加到事件列表中  
    for task in array:  
        start = task[0]  
        duration = task[1]  
        end = start + duration  
        
        # 添加开始事件和结束事件  
        events.append((start, 1))  # 任务开始  
        events.append((end, -1))    # 任务结束  
    
    # 对事件进行排序  
    events.sort()  
    
    max_concurrent_tasks = 0  
    current_tasks = 0  
    
    # 遍历所有事件  
    for time, event in events:  
        current_tasks += event  # 更新当前任务数  
        max_concurrent_tasks = max(max_concurrent_tasks, current_tasks)  # 更新最大并发数  
    
    return max_concurrent_tasks  

108 小M的弹子游戏机挑战

思路:1. 定义状态

-   创建一个 DP 表 `dp[i][j]`,表示从上到达位置 `(i, j)` 时的最大分数。
  1. 状态转移

    • 从最后一行开始,向上逐行处理:

      • 如果当前格是得分点,则 dp[i][j] = 得分点的值 + dp[i+1][j](即来自下一行正下方的分数)。

      • 如果当前格是钉子,则可以选择从左下或者右下弹射过来,因此:

        • 如果 (i+1, j-1) 和 (i+1, j+1) 是合法位置,我们需要考虑这些位置的最大分数。
  2. 初始化

    • 最后一行的 DP 值直接反映其在原数组中的值。
  3. 结果

    • 最终结果为 DP 表第一行的最大值,即弹珠从最上方任何位置掉落时的最高分数。
def solution(n, m, array):  
    # DP 表初始化为 0  
    dp = [[0] * m for _ in range(n)]  
    
    # 初始化 DP 表的最后一行  
    for j in range(m):  
        if array[n - 1][j] >= 0:  # 只考虑得分点  
            dp[n - 1][j] = array[n - 1][j]  
    
    # 从倒数第二行向上遍历,每次更新 DP 表  
    for i in range(n - 2, -1, -1):  
        for j in range(m):  
            if array[i][j] == -1:  
                # 钉子情况,可以斜向下落  
                if j > 0:  # 左下  
                    dp[i][j] = max(dp[i][j], dp[i + 1][j - 1])  # 左下的分数  
                if j < m - 1:  # 右下  
                    dp[i][j] = max(dp[i][j], dp[i + 1][j + 1])  # 右下的分数  
            elif array[i][j] >= 0:  
                # 得分点情况,累加对应得分  
                dp[i][j] = array[i][j] + dp[i + 1][j]  

    # 找到第一行中的最大分数  
    max_score = 0  
    for j in range(m):  
        max_score = max(max_score, dp[0][j])  

    return max_score