为什么在以下代码中需要使用count-= 1?

时间:2019-08-10 18:35:58

标签: java

创建以下函数时,为了获得正确的答案,我必须添加“ 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吗?

2 个答案:

答案 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))。


还请注意:

  • 您无需在while循环之前进行搜索
  • else子句是多余的
  • 您拨打.indexOf的次数是实际需要的两倍
  • firstOccurrence+3是一种责任,当字符串更改时,您将忘记更新偏移量,并且很难进行跟踪。将搜索到的字符串存储在一个位置,然后计算其长度,而不是对其进行硬编码。

编辑:好吧@AndyTurner为您重写了它,但请尝试看看列出的每个点如何达到该结果