华为OD机试真题e卷 Javascript 实现【DNA序列】

 目录

题目

思路

考点

Code


题目

一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的 GC-Ratio 可能是基因的起始点。
给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。
DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等,但是没有 AGT , CT 等等

数据范围:字符串长度满足 1≤n≤1000,输入的字符串只包含 A/C/G/T 字母

输入描述:
输入一个string型基因序列,和int型子串的长度

输出描述:
找出GC比例最高的子串,如果有多个则输出第一个的子串

示例1:
输入
ACGT
2
输出
CG
说明
ACGT长度为2的子串有AC,CG,GT3个,其中AC和GT2个的GC-Ratio都为0.5,CG为1,故输出CG

示例2:
输入
AACTGTGCACGACCTGA
5
输出
GCACG
说明
虽然CGACC的GC-Ratio也是最高,但它是从左往右找到的GC-Ratio最高的第2个子串,所以只能输出GCACG。

思路

1:题目有点绕,但是翻译一下,其实就是固定长度的子串中找到GC 比例最高的那个。

2:固定子串,明显就能想到滑动窗口这个方法,随着窗口的向右移动,处理一下新加入和刚退出窗口的字符即可。

3:代码解释:

  1. 输入和初始化

    • 函数 maxSubstrWithCG 接受两个参数:一个字符串 input_str 和一个整数 n,表示窗口大小。
    • 通过遍历字符串的前 n 个字符,计算其中包含字符 'C' 或 'G' 的数量,初始化 countmax
  2. 滑动窗口

    • 使用两个指针 leftright 定义一个窗口,left 是窗口的左边界,right 是右边界。
    • 每次移动窗口时,检查左边界的字符是否是 'C' 或 'G',如果是则减少 count,然后检查右边界的字符是否是 'C' 或 'G',如果是则增加 count
  3. 更新最大值和起始位置

    • 每次移动窗口时,若当前窗口内的 'C' 和 'G' 的数量大于当前最大值,则更新 maxstart_pos,记录新的起始位置。
  4. 返回结果

    • 最后,返回从 start_pos 开始的长度为 n 的子串,作为最终的结果。

考点

1:数据结构

2:滑动窗口法

Code

function maxSubstrWithCG(input_str, n) {
    let count = 0;
    let max = 0;
    let left = 0;
    let right = n;
    let start_pos = 0;

    // 初始窗口计算
    for (let i = 0; i < n; i++) {
        if (input_str[i] === 'C' || input_str[i] === 'G') {
            count++;
        }
    }
    max = count;

    // 滑动窗口计算
    while (right < input_str.length) {
        // 退出窗口字符
        if (input_str[left] === 'C' || input_str[left] === 'G') {
            count--;
        }
        // 移入窗口字符
        if (input_str[right] === 'C' || input_str[right] === 'G') {
            count++;
        }

        // 更新最大值和起始位置
        if (count > max) {
            max = count;
            start_pos = left + 1;
        }

        left++;
        right++;
    }

    // 返回目标子串
    return input_str.substr(start_pos, n);
}

// 示例调用:
let result = maxSubstrWithCG("ACGT", 2);
console.log(result);  // 输出符合条件的子串

   要求

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld

语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3), 
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)

 更多题目链接:

华为OD 2025 最新最全机试题库及讲解,A+B+C+D+E卷题库大全。

Java题库: 2024华为OD机试(JAVA)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试真题-CSDN博客

Python题库: 2024华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试好过吗-CSDN博客

C++题库: 2024华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od怎么知道考的是a卷还是b卷-CSDN博客

Js题库: 2024 华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od 2023 q2b卷-CSDN博客

C语言题库: 2024 华为OD机试(C语言)真题【E卷+A卷+B卷+C卷+D卷】目录-CSDN博客

面试手撕题库: 2024华为OD面试手撕代码真题目录_华为od手撕代码-CSDN博客