创建以下函数时,为了获得正确的答案,我必须添加“ count- = 1”行,否则答案会偏斜1。
public int countCTG(String dna) {
int count = 0;
int firstOccurrence = dna.indexOf("CTG");
if (firstOccurrence != -1) {
count +=1;
while (dna.indexOf("CTG", firstOccurrence) != -1 && firstOccurrence != -1) {
count +=1;
firstOccurrence = dna.indexOf("CTG", firstOccurrence+3);
}
count -=1;
}
else {
count = 0;
}
return count;
}
我设法使此功能起作用,但是请您能帮助我了解其背后的逻辑吗? count变量最初被初始化为0,例如,如果某个字符串包含“ CTG”的一个实例,则它将在“ count + = 1”行中进行计数。不会计数-= 1将该变量重置为0吗?
答案 0 :(得分:1)
由于循环之前需要+1,因此您需要-1:while循环的第一次迭代会再次计数已经发现的事件。
一个更简单的解决方案是这样的:
int count = 0;
int skip = "CTG".length();
int current = -skip;
while ((current = dna.indexOf("CTG", current + skip)) >= 0) {
++count;
}
return count;
答案 1 :(得分:0)
因为您在第一次搜索后没有更新firstOccurrence
,即您从头开始搜索了两次(.indexOf("CTG")
),然后才从前一个开始搜索结果(.indexOf("CTG", prevResultIndex + 3)
)。
还请注意:
.indexOf
的次数是实际需要的两倍firstOccurrence+3
是一种责任,当字符串更改时,您将忘记更新偏移量,并且很难进行跟踪。将搜索到的字符串存储在一个位置,然后计算其长度,而不是对其进行硬编码。编辑:好吧@AndyTurner为您重写了它,但请尝试看看列出的每个点如何达到该结果