目录
题目
一个 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:代码解释:
输入和初始化:
- 函数
maxSubstrWithCG
接受两个参数:一个字符串input_str
和一个整数n
,表示窗口大小。- 通过遍历字符串的前
n
个字符,计算其中包含字符 'C' 或 'G' 的数量,初始化count
和max
。滑动窗口:
- 使用两个指针
left
和right
定义一个窗口,left
是窗口的左边界,right
是右边界。- 每次移动窗口时,检查左边界的字符是否是 'C' 或 'G',如果是则减少
count
,然后检查右边界的字符是否是 'C' 或 'G',如果是则增加count
。更新最大值和起始位置:
- 每次移动窗口时,若当前窗口内的 'C' 和 'G' 的数量大于当前最大值,则更新
max
和start_pos
,记录新的起始位置。返回结果:
- 最后,返回从
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博客