关于数组元素减法和比较的逻辑

时间:2012-04-23 11:13:53

标签: java logic

我为以下问题编写了代码,但输出不符合预期。我不知道我的代码是否有问题。逻辑似乎很好。任何人都可以看到我的代码是否有问题。

给定按升序排序的分数数组,如果数组包含3个相互不同的分数,则返回true,最多2个,例如{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;
}

This是该问题的链接。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您的for循环应为for(int i=0; i<scores.length-2; i++){,否则您将获得ArrayOutOfBoundsException

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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;
}