DNA序列编辑距离 | 豆包MarsCode AI刷题

28 阅读4分钟

问题描述

小R正在研究DNA序列,他需要一个函数来计算将一个受损DNA序列(dna1)转换成一个未受损序列(dna2)所需的最少编辑步骤。编辑步骤包括:增加一个碱基、删除一个碱基或替换一个碱基。

思路讲解

  1. 功能概述 - 这段代码的目的是计算给定成绩列表A中,有多少学生在关于自己成绩排名的表述上是说谎的。这里假设每个学生声称自己的成绩高于其他学生的数量比低于或等于自己成绩的学生数量多(即声称自己是成绩排名前半部分的学生)。
  2. 代码细节 - n = len(A): - 首先获取成绩列表A中元素的数量,也就是学生的数量,存储在n中。这将用于后续计算成绩高于和低于等于某个成绩的学生数量。 - liar_count = 0: - 初始化一个变量liar_count为0,用于记录说谎的学生数量。 - for score in A:循环: - 遍历成绩列表A中的每个成绩score。 - less_equal_count = sum(1 for x in A if x <= score): - 使用生成器表达式计算成绩列表A中小于等于当前成绩score的学生数量。对于列表A中的每个元素x,如果x <= score,则生成一个值为1的元素(通过1 for x in A if x <= score),然后使用sum函数对这些1进行求和,得到小于等于当前成绩的学生数量,存储在less_equal_count中。 - greater_count = n - less_equal_count: - 通过学生总数n减去小于等于当前成绩的学生数量less_equal_count,得到成绩高于当前成绩的学生数量,存储在greater_count中。 - if less_equal_count > greater_count:条件判断: - 如果小于等于当前成绩的学生数量大于成绩高于当前成绩的学生数量,说明该学生声称自己的成绩排名情况不符合实际(因为按照假设,成绩排名前半部分的学生应该是成绩高于其他学生的数量比低于或等于自己成绩的学生数量多),则该学生说谎。 - liar_count += 1: - 如果上述条件成立,将说谎学生数量liar_count加1。
  3. 整体逻辑 - 对于成绩列表中的每个学生,通过比较成绩小于等于自己的学生数量和成绩高于自己的学生数量,判断该学生是否说谎。如果是,则增加说谎学生数量的计数。最后返回说谎学生的总数。通过多个测试用例(如[100, 100, 100]等)来验证函数的正确性,每个测试用例都预期得到一个特定的结果(通过print(solution([...]) ==...)来比较函数返回值和预期值是否相等)。

代码详解

def solution(A):
# 学生的数量
n = len(A)
# 用于记录说谎的学生数量
liar_count = 0

# 遍历每个学生的成绩
for score in A:
    # 计算成绩小于等于该学生成绩的学生数量
    less_equal_count = sum(1 for x in A if x <= score)
    # 计算成绩高于该学生成绩的学生数量
    greater_count = n - less_equal_count
    
    # 如果小于等于的学生数量大于高于的学生数量,则该学生说谎
    if less_equal_count > greater_count:
        liar_count += 1
        
return liar_count

if __name__ == "__main__":
# 测试用例
print(solution([100, 100, 100]) == 3)  # 输出: True
print(solution([2, 1, 3]) == 2)         # 输出: True
print(solution([30, 1, 30, 30]) == 3)   # 输出: True
print(solution([19, 27, 73, 55, 88]) == 3)  # 输出: True
print(solution([19, 27, 73, 55, 88, 88, 2, 17, 22]) == 5)  # 输出: True

知识总结

这段代码定义了一个函数solution,用于计算成绩列表中说谎学生的数量。通过遍历成绩列表,计算每个成绩的相对排名情况,判断学生是否说谎。运用了列表长度获取、生成器表达式、条件判断和计数变量等知识,最后通过测试用例验证函数的正确性。

学习建议

  1. 主动思考:在学习过程中,思考代码的优化方向,如算法效率改进。 2. 拓展应用:尝试将此逻辑应用于其他类似场景,如分析数据排名情况。 3. 对比学习:与其他解决相同问题的代码进行对比,理解不同实现方式的优缺点,拓宽编程思路。

学习计划

  1. 理解代码功能:分析代码如何计算说谎学生数量,掌握核心逻辑。 2. 深入语法:剖析sum函数与生成器表达式的用法,以及条件判断和循环结构。 3. 实践练习:修改测试用例,尝试不同数据,观察结果变化,巩固所学知识,提升编程能力。