字节青训-完美偶数计数、环状 DNA 序列的最小表示法

 一、完美偶数计数

问题描述

小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:

  1. xx 是偶数;
  2. xx 的值在区间 [l,r][l,r] 之间。

现在,小C有一个长度为 nn 的数组 aa,她想知道在这个数组中有多少个完美偶数。

测试样例

样例1:

输入:n = 5,l = 3,r = 8,a = [1, 2, 6, 8, 7]
输出:2

样例2:

输入:n = 4,l = 10,r = 20,a = [12, 15, 18, 9]
输出:2

样例3:

输入:n = 3,l = 1,r = 10,a = [2, 4, 6]
输出:3

解题思路:

问题理解

我们需要在一个数组 a 中找出满足以下两个条件的元素个数:

  1. 该元素是偶数。
  2. 该元素在区间 [l, r] 之间。

数据结构选择

由于我们只需要遍历数组并检查每个元素是否满足条件,因此不需要额外的数据结构。直接使用数组即可。

算法步骤

  1. 遍历数组:我们需要遍历数组 a 中的每一个元素。
  2. 检查条件:对于每一个元素,检查它是否是偶数,并且是否在区间 [l, r] 之间。
  3. 计数:如果元素满足上述两个条件,则计数器加一。
  4. 返回结果:遍历结束后,返回计数器的值。

最终代码:

def is_even_number(a):
    return a % 2 == 0

def solution(n, l, r, a):
    # 计算在范围 [l, r] 内的偶数个数
    return sum(1 for i in a if is_even_number(i) and l <= i <= r)

if __name__ == "__main__":
    a1 = [1, 2, 6, 8, 7]
    print(solution(5, 3, 8, a1) == 2)  # 输出: True

    a2 = [12, 15, 18, 9]
    print(solution(4, 10, 20, a2) == 2)  # 输出: True

    a3 = [2, 4, 6]
    print(solution(3, 1, 10, a3) == 3)  # 输出: True

运行结果:

 

二、环状 DNA 序列的最小表示法

问题描述

小C正在研究一种环状的 DNA 结构,它由四种碱基ACGT构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。

例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCATCAACAATAATC,其中 AATC 是字典序最小的表示。

测试样例

样例1:

输入:dna_sequence = "ATCA"
输出:'AATC'

样例2:

输入:dna_sequence = "CGAGTC"
输出:'AGTCCG'

样例3:

输入:dna_sequence = "TTGAC"
输出:'ACTTG'

 

解题思路:

 

问题理解

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

数据结构选择

我们可以使用一个列表来存储所有可能的表示方式,然后对这些表示方式进行排序,最后返回字典序最小的那个。

算法步骤

  1. 生成所有可能的表示方式

    • 对于每个起始位置 i,生成一个新的字符串,该字符串是从位置 i 开始,依次读取后续字符,直到回到位置 i 为止。
    • 将生成的字符串添加到一个列表中。
  2. 排序

    • 对列表中的字符串进行排序,字典序最小的字符串会排在最前面。
  3. 返回结果

    • 返回排序后的列表中的第一个字符串,即字典序最小的表示方式。

最终代码:

def solution(dna_sequence):
    res = []
    for i in range(len(dna_sequence)):
        s = ""
        for j in range(len(dna_sequence)):
            s += dna_sequence[(i + j) % len(dna_sequence)]
        res.append(s)
    res.sort()
    return res[0]

# 测试用例
print(solution("ATCA") == "AATC")  # 输出: True
print(solution("CGAGTC") == "AGTCCG")  # 输出: True
print(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")  # 输出: True

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像污秽一样

谢谢谢谢谢谢谢谢谢谢谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值