JavaScript查找重复DNA序列时截取子串长度非10的问题
代码错误排查
你的代码一共有3处逻辑错误,直接导致子串长度不符合预期、功能结果错误:
substr方法参数传错String.prototype.substr()的第一个参数是截取起始下标,第二个参数是固定截取的字符长度,不是截取的结束偏移量。你当前写的s.substr(i, i + 10)会随着循环变量i从0开始递增,让第二个参数从10开始逐次加1,截取出来的子串长度自然会越来越长。这里第二个参数应该固定传10。- 循环终止条件写错
截取固定长度为10的子串时,最后一个合法的起始下标是s.length - 10(下标从0开始计数)。你当前写的i < s.length - 11会提前终止循环,漏掉末尾2个合法的10位长度子串,正确的终止条件应该是i <= s.length - 10,等价写法为i < s.length - 9。 - 返回值逻辑错误
你定义seqSet的作用是存储重复出现的DNA序列,但最后返回的是存储所有已遍历子串的set,和「查找所有重复出现的长度为10的DNA序列」的需求不符,最终应该返回Array.from(seqSet)。
修正后的可运行代码如下:
const s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" var findRepeatedDnaSequences = function(s) { const seenSet = new Set() const repeatedSet = new Set() // 修正循环终止条件 for (let i = 0; i <= s.length - 10; i++) { // 固定截取10位长度子串 const subStr = s.substr(i, 10) if (seenSet.has(subStr)) { repeatedSet.add(subStr) } else { seenSet.add(subStr) } } // 返回重复序列组成的数组 return Array.from(repeatedSet) }; console.log(findRepeatedDnaSequences(s)) // 运行输出:[ 'AAAAACCCCC', 'CCCCCAAAAA' ]
内容的提问来源于stack exchange,提问作者conner brain
相关产品推荐
相关产品推荐

