题目解析 | 豆包MarsCode AI刷题

45 阅读3分钟

完美偶数计数

题目理解

题目要求我们找出一个数组中满足特定条件的“完美偶数”的数量。具体条件如下:

  1. 该数必须是偶数。
  2. 该数必须在给定的区间 [l, r] 之间。

解题思路

  1. 遍历数组:我们需要遍历数组中的每一个元素。
  2. 检查条件:对于每一个元素,检查它是否满足以下两个条件:
    • 该元素是否为偶数(即 num % 2 == 0)。
    • 该元素是否在区间 [l, r] 之间(即 l <= num <= r)。
  3. 计数:如果某个元素同时满足上述两个条件,则将其计入“完美偶数”的数量。
  4. 返回结果:遍历完数组后,返回满足条件的元素数量。

数据结构选择

  • 使用一个整数变量 count 来记录满足条件的元素数量。

算法步骤

  1. 初始化一个计数器 count 为 0。
  2. 遍历数组 a 中的每一个元素 num
  3. 对于每一个元素 num,检查它是否为偶数且在区间 [l, r] 之间。
  4. 如果满足条件,则将 count 加 1。
  5. 遍历结束后,返回 count

代码实现

def solution(n: int, l: int, r: int, a: list) -> int:
    # 初始化计数器
    count = 0
    
    # 遍历数组中的每个元素
    for num in a:
        # 检查当前元素是否为偶数,并且是否在区间 [l, r] 之间
        if num % 2 == 0 and l <= num <= r:
            count += 1
    
    return count

环状DNA序列的最小表示法

题目理解

题目要求我们找到一个环状DNA序列的字典序最小的表示。由于DNA序列是环状的,我们可以从任意位置开始读取序列,因此一个长度为 n 的序列可以有 n 种不同的表示方式。我们需要从这 n 种表示中找到字典序最小的那个。

数据结构选择

由于我们需要比较多个字符串的字典序,使用字符串作为基本数据结构是合适的。

算法步骤

  1. 复制序列:为了方便生成所有可能的表示,我们可以将原始序列复制一次,形成一个长度为 2n 的序列。这样,从任意位置 i 开始的 n 个字符就构成了一个可能的表示。
  2. 遍历所有可能的表示:从 0n-1 遍历所有可能的起始位置,生成对应的表示。
  3. 比较字典序:在遍历过程中,比较当前生成的表示与已知的最小表示,如果当前表示更小,则更新最小表示。
  4. 返回结果:遍历结束后,返回找到的最小表示。

代码实现思路

  1. 复制序列:将原始序列 dna_sequence 复制一次,形成 doubled_sequence
  2. 初始化最小表示:将最小表示初始化为原始序列。
  3. 遍历所有可能的表示:从 1n-1 遍历所有可能的起始位置,生成对应的表示 current_representation
  4. 比较并更新最小表示:如果 current_representationmin_representation 小,则更新 min_representation
  5. 返回最小表示:遍历结束后,返回 min_representation

代码框架

def solution(dna_sequence):
    n = len(dna_sequence)
    # 复制一次序列以生成所有可能的表示
    doubled_sequence = dna_sequence + dna_sequence
    # 初始化最小表示为第一个表示
    min_representation = dna_sequence
    
    # 遍历所有可能的表示
    for i in range(1, n):
        current_representation = doubled_sequence[i:i+n]
        # 如果当前表示比最小表示小,则更新最小表示
        if current_representation < min_representation:
            min_representation = current_representation
    
    return min_representation

关键步骤解释

  • 复制序列doubled_sequence = dna_sequence + dna_sequence 这一步是为了方便生成所有可能的表示。
  • 遍历所有可能的表示for i in range(1, n) 这一步遍历所有可能的起始位置。
  • 比较并更新最小表示if current_representation < min_representation 这一步用于比较当前表示与已知的最小表示,并更新最小表示。