0

我为以下问题编写了代码,但输出不如预期。我不知道我的代码是否有问题。逻辑似乎很好。谁能看看我的代码是否有问题。

给定一个按升序排序的分数数组,如果该数组包含 3 个相邻分数,并且彼此之间最多相差 2,则返回 true,例如 {3,4,5} 或 {3,5,5}。

我的源代码如下:

public boolean scoresClump(int[] scores) {

    boolean result = false;

    for(int i=0; i<scores.length-2; i++){
        if((scores[i+1]-scores[i])<=2 && (scores[i+2]-scores[i+1])<=2){
            result = true;
            break;
        }
    }

    return result;
}

是问题的链接。

4

4 回答 4

2

干得好。您之前的帖子没有考虑非相邻值之间的增量。

public boolean scoresClump(int[] scores) {
  boolean result = false;

  for(int i=0; i<scores.length-2; i++){
      if((scores[i+2]-scores[i])<=2){
          result = true;
          break;
      }
  }

  return result;
}
于 2012-04-23T11:33:19.480 回答
0

你的for循环应该是,for(int i=0; i<scores.length-2; i++){否则你会得到一个ArrayOutOfBoundsException.

另外,您break应该在true条件而不是条件中false。目前,您的代码在第一组不匹配条件的 3 个元素之后存在循环。

此外,如果它们已经按升序排序,则无需执行Math.abs

于 2012-04-23T11:19:34.433 回答
0

首先,如果您遇到错误或意外行为,您应该描述它是什么(例如预期和实际输出)。

在您的情况下,我可以在您的代码中发现至少一个错误:您在循环分数 [i+2] 中访问。当我达到 length-1 时,您访问 length+1。即使访问 length+0 也已经是一个错误,因为最后一个元素的索引 length-1。您没有显示完整的代码,但我假设由于抛出异常,结果在调用函数中被解释为 false。

此外,这两项检查不是必需的,一项检查就足够了,因为您将在下一次迭代中执行下一次检查。

于 2012-04-23T11:19:40.613 回答
0

试试这个:

    public boolean scoresClump(int[] scores) {
boolean result=false;
for(int i=0; i<scores.length-2; i++){
        if(Math.abs(scores[i]-scores[i+1])<=2 &&
        Math.abs(scores[i+1]-scores[i+2])<=2 &&
        Math.abs(scores[i]-scores[i+2])<=2){
            result=true;
        }
}
return result;
}
于 2012-04-23T11:26:44.913 回答